标题:请教:object references an unsaved transient instance的解决方法
只看楼主
无缘今生
Rank: 2
等 级:新手上路
威 望:3
帖 子:523
专家分:7
注 册:2007-6-25
结帖率:100%
已结贴  问题点数:20 回复次数:2 
请教: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. 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. 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 
2010-09-10 16:04
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
得分:20 
按照提示信息,该对象不是持久化对象。State肯定不能用new出来的。从数据库里面查询得到State对象,必须从dao中查询出来,不能用程序硬性查询出来
2010-09-10 16:42
无缘今生
Rank: 2
等 级:新手上路
威 望:3
帖 子:523
专家分:7
注 册:2007-6-25
得分:0 
回复 2楼 linjx0123
修改过后的代码是 通过业务逻辑调用StateDao 中的get方法来取得State对象的。

StateDao 的 get方法是实现是:
public State get(int id) {
   return (State)getHibernateTemplate().get(State.class, id);
}


时不再来!!!
2010-09-10 16:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-319987-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.374940 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved