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

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,保存。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值