hibernate save(),persist(),saveorupdate(),update(),merge() 的区别与联系

在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient、persistent、detached
下边是常见的翻译办法:
transient:瞬态或者自由态
persistent:持久化状态
detached:脱管状态或者游离态

  • 瞬态状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。
  • 持久化状态实例可以通过调用 delete()变成瞬时状态,通过close(),clear(),evict()变成游离状态,通过get()或load()方法得到的实例都是持久化状态的。
  • 游离状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。

save()和persist()将会引发SQL的INSERT,delete()会引发SQL的DELETE。

update()或merge()会引发SQL的UPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,
它也会引起SQL的UPDATE。

saveOrUpdate()或者replicate()会引发SQL的INSERT或者UPDATE。


save()方法:

  • 应该避免在事务之外调用save()方法,否则关联实体(例如employee和address是一对一关系,相互关联)将不会被保存从而导致不一致。很容易忘记在最后调用flush()方法,因为不会有任务的异常或者警告抛出。
  • hibernate save()方法会立即返回id,原因很可能是调用save()的同时这个实体对象已经被写入数据库(立即执行sql语句insert into)
  • 提交事务或者调用flush()方法,save()方法才会将关联对象也写入数据库。


persist()方法:

  • persist()方法会将实体对象添加到持久化上下文中,如此被保存的实体后续改变会被记录。如果在提交事务或者会话flush(),对象的属性被重新赋值,那么这个变化也会被保存到数据库中。
  • persist()方法必须在事务内执行,才能够将数据插入数据库。如果不在事务范围内执行,数据将丢失。
  • 最后,persist()方法返回值是void,也就是说不会返回任何的值。


saveOrUpdate()方法:

  • hibernate saveOrUpdate()方法会执行插入或者更新操作。如果该对象在数据库中已经存在则更新,不存在则插入。
  • saveOrUpdate()方法可以在没有事务的情况下执行,但是如果没有手动调用flush()方法会面临关联对象不被保存的问题
  • save()方法与saveOrUpdate()方法最大的不同点在于,saveOrUpdate()方法会将实体对象添加到持久化上下文中,该实体的后续改变会被跟踪。


update()方法:

  • 当确定只更新实体信息时使用Hibernate update()方法。update()方法会将实体添加到持久化上下文,实体后续的改变会被跟踪并且当事务提交时这些改变会被保存到数据库中
  • hibernate update()方法会跟踪实体的改变,在提交事务时保存到数据库中。


merge()方法:

  • hibernate merge()方法被用于更新数据库中的记录,然而merge()方法通过创建一个传递进来的实体对象副本并且将这个副本作为返回值返回。返回值属于持久化上下文,能够跟踪实体的改变,而传递进来的实体并不能被跟踪。这一点是merge()方法与其他方法最大的不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值