123开始
使用session.merge(),
该方法将修改表中记录,其所需要的实体状态为脱管状态,但是注意,它并不影响调用方法前后的状态,也即该实体依然是脱管状。
那么什么是托管状态呢?是否还有其它类型的状态?
这就要牵扯到Hibernate的生命周期和状态的问题了!
生命周期暂且不谈。Hibernate有三种状态,一种是transient(瞬时状态),一种是persistent(持久化状态)以及detached(游离状态)。
1.什么是瞬时状态?
我们使用"new"新建一个对象之后,未做其它任何操作,此时新建的这个对象就是瞬时状态!
2.那么持久化状态呢?
当临时状态的对象被执行save之后,就会被session托管,在session中有一个map存放着对象,也就是说对象被session引用着,被session纳入管理了。此时的就处于持久状态了。
3.游离呢?
当一个持久化状态的对象,在session关闭之后,它就变成游离状态的了!
session.merge(oestudent);
session.merge()方法会首先发送一句select语句,去数据库端获取oestudent持久化标识所对应的表记录;然后自动生成一个持久化状态的oestudent实体,与脱管状态的oestudent实体做比较是否有所改变;一旦发生了改变,才会发送update语句执行更新。而按执行顺序,若两句session.merge()方法针对同一个脱管状态的oestudent实体,那其结果只会执行最后一个session.merge()方法所发出的update语句。即使执行了session.merge()方法,oestudent实体依然是脱管状态。
即,就是更新数据的!