接触到mybatis竟然有把hibernate抛弃的想法。
言归正传,贴图为先。hibernate的三种状态位和切换之间对函数的使用;
总结下saveorupdate(),save(),update(),merge()这几个函数;
save(),update():都是很好理解的
save()在数据库中生成一条记录,如果数据库中有,会报错说有重复的记录。
update()就是更新数据库中的记录;
merge()就非常奇葩:
1.如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例;
2.如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例;
3.最后返回该持久实例;
4.用户给出的这个对象没有被关联到session上,它依旧是脱管的;
merge()参考:http://blog.csdn.net/lang_man_xing/article/details/7572964
saveorupdate():可以上面的图片这里的一句话。更深度的理解就是Java面向对象是方方面面的。
临时对象,也就是不在Session里边,没有持久化标识,数据库中也没有对应的这个数据的记录,此时才能用save;
持久化对象,在Session里边的,拥有持久化标识OID,此时的数据的内容只要修改,(ID)不能变,会引起数据此对象和数据库的联动,
这是Hibernate通过同步来实现的。具体怎么实现,可参考对象的生命周期,和垃圾回收有一丝关系。此时的数据只要修改就算不使用saveOrUpdate也会达到更新数据库的效果。
还有一种对象:脱管对象。此对象拥有持久化标识,也就是说数据库中有这个对象对应的数据记录,但是Session关闭了,也就是说Session的缓存中没有这个对象了。不受Session的管理了。此时如果修改了这个对象的属性,不会了生联动,
也就是数据不会反映到数据库中去,除非调用saveOrUpdate()方法,并且commit后,此对象又成了持久化对象。