当前位置: 代码迷 >> Java Web开发 >> 请教:object references an unsaved transient instance的解决方法
  详细解决方案

请教:object references an unsaved transient instance的解决方法

热度:470   发布时间:2010-09-10 16:04:55.0
请教: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>

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>

请大家不吝赐教!

[ 本帖最后由 无缘今生 于 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);
}


----------------解决方案--------------------------------------------------------
  相关解决方案