今天同事发现个问题,从使用get(id)的形式从数据库中获得对象,改变对象的ID,在没有使用update和merge方法的情况下竟然保存到数据库中了。当时很不解,后来就在网上搜,才知道是hibernate把get(id)获得的对象称为持久化对象,对其做的更改会在事务提交后保存到数据库中。也知道需要了解hibernate对象的三种状态了,临时状态,持久化状态和游离态。下面是在百度知道上搜到的答案,整理其中两条(其实这种框架了解的并不深啊,只是会用而已):
?
你通过get(id)拿到的对象,就是持久化对象。
你对持久化对象的任何更改,会在session.flush或者提交事务的时候更新到数据库。
不过也要结合事务。
如:
开启事务。
查询对象。
改变对象。//不需要显示的update。
提交事务。
就可以更新数据库。
建议学习一下hibernate的瞬态,持久态,托管态。
?
首先你要知道,hibernate的update操作的运行机理:
hibernate的update是怎么样自动的进行update操作的呢?
首先hibernate先会执行一个select操作,到数据库中查找当前要update操作的对象的主键是否存在,类似于:select id from table where id=XXX
如果查找到了改id,就说明该对象是一个持久化对象,如果该对像的某些属性变化了,hibernate就会自动的执行update操作,同步数据库中的该对象。
如果hibernate没有查找到该id,就说明该对象是一个游离的对象,hibernate就会执行insert操作。
根据这些,就可以找找是不是要update的对象的id在数据库中不存在,或是更改的该对象的id。这些都是执行insert而不是update。
?