分析
瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。
持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。
脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到。
持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。
脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到。
其实还有一种状态 就是移除状态 session.delete() 后在session还没有关闭之前 数据库中没有数据与之对应,当前对象与session有关联
1.save方法
将瞬时实例持久化,此时它与当前的session和持久化上下文都建立了联系。
2.get/load方法
这两个方法都是从数据库中取得持久化对象,在持久化上下文关闭后变为脱管状态。其区别在于如果数据库中不存在指定标识符的行,get会返回null,而load会抛出ObjectNotFoundException。
3.delete方法
调用后对象变为移除状态,session关闭后变为瞬时状态。
4.update/lock方法
对象在传递到update方法之前是否被修改没有关系,update方法把这个脱管实例附到一个新的session及持久化上下文,hibernate始终将这个对象当做脏对象来处理。而在调用lock之前对对象的修改不会传播到数据库。
5.merge方法
调用merge方法的时候,hibernate会检查在持久化上下文中的持久化实例是否和脱管实例具有相同的标识符。如果有,把脱管实例的状态负责到持久化实例中;如果没有,就从数据库中加载,然后把脱管实例和获取的对象状态合并;如果数据库中没有查到结果,就创建新的持久化实例,把脱管实例的状态复制到新实例,插入到数据库中,并通过merge()操作返回
将瞬时实例持久化,此时它与当前的session和持久化上下文都建立了联系。
2.get/load方法
这两个方法都是从数据库中取得持久化对象,在持久化上下文关闭后变为脱管状态。其区别在于如果数据库中不存在指定标识符的行,get会返回null,而load会抛出ObjectNotFoundException。
3.delete方法
调用后对象变为移除状态,session关闭后变为瞬时状态。
4.update/lock方法
对象在传递到update方法之前是否被修改没有关系,update方法把这个脱管实例附到一个新的session及持久化上下文,hibernate始终将这个对象当做脏对象来处理。而在调用lock之前对对象的修改不会传播到数据库。
5.merge方法
调用merge方法的时候,hibernate会检查在持久化上下文中的持久化实例是否和脱管实例具有相同的标识符。如果有,把脱管实例的状态负责到持久化实例中;如果没有,就从数据库中加载,然后把脱管实例和获取的对象状态合并;如果数据库中没有查到结果,就创建新的持久化实例,把脱管实例的状态复制到新实例,插入到数据库中,并通过merge()操作返回
By 变坏的好人