浅谈hibernate save和saveOrUpdate区别

Hibernate的对象有3种状态,分别为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object)。

save和saveOrUpdate的区别,估计大家都比较了解

save是保存要持久化的数据,会走insert语句

saveOrUpdate是根据unsave-value的设定,判定是要save还是update操作

今天,做项目碰到一个问题,我在service层中的一个函数中对一个实体batch(批次)进行一次save然后进行数据处理,最后又调用了一次update方法用于更新batch的状态,即添加时状态为“0”,数据处理后更新状态为“1”,此时出现

a different object with the same identifier value was already associated with the session异常,它的意思是在一个操作里有了两个同样的标示符,分析后认为update时数据需为po,但save后batch变为了vo状态,此时update时导致此异常,后来在update前先get一下batch然后update是没问题的,但是这样有导致多走了一次select语句,因为batch与数据库是一直的(因为刚刚save),所以就想如何让其insert后仍然处于po状态,后来看到资料使用了saveOrUpdate方法,测试后发现,没有问题,不再出异常,所以认为save和 saveOrUpdate除了在运行机制上有区别以外,在insert以后,save后的实体处于vo状态,而通过saveOrUpdate后的实体 处于po状态,可以修改实体后直接调用update方法,执行更新操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值