Hibernate使用get(id)获得的对象进行更改会在事务提交时持久化到数据库中(即使不用update和merge方法)...

今天同事发现个问题,从使用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。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值