save, saveOrUpdate, persist, merge 区别

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()方法与其他方法最大的不同。

参考来源:https://www.cnblogs.com/xiaoheike/p/5374613.html

猜你喜欢

转载自blog.csdn.net/fly910905/article/details/81069932