请教:object references an unsaved transient instance的解决方法
我使用Hibernate3 + spring2.5.6 + struts2.1.8 做一个小系统其中,有两个实体是一对多的关系(State 与 Article),State 作为一个属性在Article中,
在修改Article时,需要更新State。 最初我先直接用State st = new State(),然后再用set设置st的具体内容。结果抛出如下异常:
object references an unsaved transient instance - save the transient instance before flushing: pbc.bz.intendance.model.State; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: pbc.bz.intendance.model.State
然后在网上找了些方法,试了都不行。
后来想会不会是因为new 的对象不是持久的,我就先从数据库里面查询得到State对象,然后再set到Article中,可是还是一样的效果。
又在网上看到说是两个实体的一对多、多对多的关系出现问题。
我的配置是:State.hbm.xml文件
程序代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="pbc.bz.intendance.model">
<class name="State" table="state" dynamic-update="true">
<!-- 映射标识属性 -->
<id name="stateId" column="state_id" type="integer">
<generator class="identity" />
</id>
<!-- 下面映射用户的其他普通属性 -->
<property name="stateName" column="state_name" type="string"
not-null="true" length="50" />
<property name="stateDesc" column="state_desc" type="string"
not-null="true" length="100" />
<!-- State与Intendance的映射关系(一对多) -->
<set name="articles" lazy="false" inverse="true" >
<key column="state_id" not-null="false" />
<one-to-many class="Article" />
</set>
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="pbc.bz.intendance.model">
<class name="State" table="state" dynamic-update="true">
<!-- 映射标识属性 -->
<id name="stateId" column="state_id" type="integer">
<generator class="identity" />
</id>
<!-- 下面映射用户的其他普通属性 -->
<property name="stateName" column="state_name" type="string"
not-null="true" length="50" />
<property name="stateDesc" column="state_desc" type="string"
not-null="true" length="100" />
<!-- State与Intendance的映射关系(一对多) -->
<set name="articles" lazy="false" inverse="true" >
<key column="state_id" not-null="false" />
<one-to-many class="Article" />
</set>
</class>
</hibernate-mapping>
Article.hbm.xml文件
程序代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="pbc.bz.intendance.model">
<class name="Article" table="article" dynamic-update="true">
<!-- 映射标识属性 -->
<id name="article" column="article_id" type="integer">
<generator class="identity"></generator>
</id>
<!-- 下面映射用户的其他普通属性 -->
<property name="projectName" column="project_name" type="string"
not-null="true" length="100" />
<!-- 映射该Intendance关联的反馈信息Feedback -->
<many-to-one name="back" column="back_id" class="Feedback" lazy="false" />
<!-- 映射该Intendance所处的状态State -->
<many-to-one name="state" column="state_id" class="State" not-null="true" lazy="false"/>
<property name="submitDate" column="submit_date" type="date"
not-null="true" />
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="pbc.bz.intendance.model">
<class name="Article" table="article" dynamic-update="true">
<!-- 映射标识属性 -->
<id name="article" column="article_id" type="integer">
<generator class="identity"></generator>
</id>
<!-- 下面映射用户的其他普通属性 -->
<property name="projectName" column="project_name" type="string"
not-null="true" length="100" />
<!-- 映射该Intendance关联的反馈信息Feedback -->
<many-to-one name="back" column="back_id" class="Feedback" lazy="false" />
<!-- 映射该Intendance所处的状态State -->
<many-to-one name="state" column="state_id" class="State" not-null="true" lazy="false"/>
<property name="submitDate" column="submit_date" type="date"
not-null="true" />
</class>
</hibernate-mapping>
请大家不吝赐教!
[ 本帖最后由 无缘今生 于 2010-9-10 16:46 编辑 ]
搜索更多相关主题的帖子:
unsaved transient references object instance
----------------解决方案--------------------------------------------------------
按照提示信息,该对象不是持久化对象。State肯定不能用new出来的。从数据库里面查询得到State对象,必须从dao中查询出来,不能用程序硬性查询出来
----------------解决方案--------------------------------------------------------
回复 2楼 linjx0123
修改过后的代码是 通过业务逻辑调用StateDao 中的get方法来取得State对象的。StateDao 的 get方法是实现是:
程序代码:
public State get(int id) {
return (State)getHibernateTemplate().get(State.class, id);
}
return (State)getHibernateTemplate().get(State.class, id);
}
----------------解决方案--------------------------------------------------------