Hibernate 异常:object references an unsaved transient instance - save the transient instance before fl

来源:互联网 发布:网络问政平台是什么 编辑:程序博客网 时间:2024/06/06 00:46

hibernate中级联操作,当存储一个对象时,报错Hibernate 异常:object references an unsaved transient instance - save the transient instance before fl

次在网上查阅资料,解决的方法是在主控方的 set 标签上把 cascade 属性修改为"save-update" 即可。

而 cascade 属性如何使用呢?以下是该属性的值。

all : 所有情况下均进行关联操作。
none:所有情况下均不进行关联操作。(默认值)
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作。

由于默认使用的是 none ,所以当主表级联更新子表时,主表处于瞬时状态,因此需要将其设置为"save-update"(这句话是推测)

但是我的不想这么麻烦的级联操作。

@Test    @Rollback(false)    public void insert(){//T entity    long selfID=0;    long attentionerID=1;    User self=(User) userDao.get(selfID);    User attentioner=(User) userDao.get(attentionerID);    Attention attention=new Attention();    attention.setSelf(self);    attention.setAttentioner(attentioner);    attention.setCreateTime(new Date());    attentionDao.insert(attention);    }
主要是由于user取出来之后,其实session已经关闭,此时user已经变成游离态。

所以当attentionDao.insert(attention);的时候,首先要持久化attention中关联的user。

所以会产生insert into user的语句,先保存user。
而user的主键生成策略是 

<id name="userID" column="userID" type="long"> 
        <generator class="native"></generator>

 </id>

所以即使取出来的user中userID不为空,也会重新附一个值,根据数据库自增长

这样就不是之前的self或者attentioner的userID了,会改变


要取出来的user就是数据库中已有ID的user,可以将主键生成策略改成assgined,这样持久化user的时候,

会去一次user,发现跟已有的self或者attentioner值未改变,因为不会去insert,保存。







原创粉丝点击