分享

hibernate对象三种状态 持久 游离和 瞬时

 沙门空海 2017-12-10

 初学者大家有一个误区就是hibernate对象三种状态 持久 游离和 瞬时究竟hibernate为什么要定义这三种状态和作用是什么,因为在开发中我看到同事好多在乱用也包括我自己,所以就自己写了点东西供大家参考。
咱们通过 get load Query对象取出的数据 都是持久态的
1.为什么叫持久态的呢 是咱们在 事物提交时候 如果提交了这个对象这个对象之前的操作都会被存入数据库
持久态只有在事物提交后才能真正的持久 也就是数据库数据改变 这就是持久态的终极意义

2.哪些对象是游离态的呢 是从持久化的数据转化而来 比如你session关闭或者从session里delete了这个对象等
这个时候 hibernate定义了这种对象就叫游离态的了 如果你在事物提交里面之前改变了这个对象 是不会反应到数据库里面这就是游离的特征 讲完了 然后讲瞬时 
3.瞬时最简单 和hibernate session无关 就是咱们直接new的对象 hibernate叫他瞬时态对象
他和游离一样 事物提交也不能改变数据库对应的数据


有人说 我想把瞬时对象和游离对象要变成持久的怎么办
hibernate提供的 save update等方法就是把非持久化的对象变成持久态的了 

 

 

当我们User user=new User()一个对象时,它表示创建一个瞬时对象,当调用save(user)方法时,这个对象成为持久对象,直到事务提交,数据库连接关闭。在这期间,如果我们user.setXXX()时,会对这个持久对象产生影响,最终它也会被提交到数据库,它的最终提交是在提交事务时。

 比如save(user)方法后,跟user.setName("new name");user.setPassword("new password");这两句,这样它会在提交时务时,采取对数据库的更新操作,也就是说数据库连接关闭后,数据库存的是“new name”和“new password” 而如果开启了“数据库语言显示”可以发现执行两次操作:一次是save方法的插入操作,一次是setXXX后提交事务时的更新作(特别说明,持久对象在发生改变时,比如setXXX方法改变对象内容时,会在最后,即提交事务时统一进行更新操作,而并非每一次改变就执行一次更新,这样可以保证与数据库的交互更高效合理)。当执行完save方法后,我们关闭数据库连接时,这时的user对象就是脱管状态,因为它在数据库有数据与之对应而脱管状态的最好例子是当我们用get方法得到一个对象并关闭连接时。

 既然我们已经知道了持久对象可以被Hibernate检测到进行更新操作,那么update是否还有用了?有,比如脱管对象就可以调用update来更新数据库中的数据,而调用update()方法后的脱管对象又变成了持久对象。


再谈saveOrUpdate方法:此方法兼具了save和update两种方法。它根据传递的参数来选择执行其中的一种方法。如果参数对象是瞬时态,则执行save方法,而如果参数对象是脱管态,则执行update方法。最终都是把传递的参数对象转成持久态。

 

 总结:在一般hibernate事务操作过程中,基本都是通过检测对象的状态来选择执行save或update操作,如果是瞬时态,说明此对象是new出来的一个新对象,对应的数据库没有此对象,执行save操作,如果是托管状态,说明此对象之前是持久态,对应的数据库中有此对象,执行update操作,saveOrUpdate方法就是检测对象的状态选择执行对应的操作。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多