zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    sql初始化XML操作
    c#字符串操作方法实例
    C#日期格式转换
    asp.net中打印指定控件内容
    NET中验证控件表达式汇总
    js中页面刷新和页面跳转的方法总结
    数据库备份与还原SQL代码
    NIO 基础之 Buffer
    Java堆外内存之突破JVM枷锁
    JAVA NIO:Buffer.mark()的用法
  • 原文地址:https://www.cnblogs.com/daweige/p/8295180.html
Copyright © 2011-2022 走看看