初学者大家有一个误区就是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()时,会对这个持久对象产生影响,最终它也会被提交到数据库,它的最终提交是在提交事务时。
再谈saveOrUpdate方法:此方法兼具了save和update两种方法。它根据传递的参数来选择执行其中的一种方法。如果参数对象是瞬时态,则执行save方法,而如果参数对象是脱管态,则执行update方法。最终都是把传递的参数对象转成持久态。
总结:在一般hibernate事务操作过程中,基本都是通过检测对象的状态来选择执行save或update操作,如果是瞬时态,说明此对象是new出来的一个新对象,对应的数据库没有此对象,执行save操作,如果是托管状态,说明此对象之前是持久态,对应的数据库中有此对象,执行update操作,saveOrUpdate方法就是检测对象的状态选择执行对应的操作。