• 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。

  • 相关阅读:
    RabbitMQ学习之:(一)初识、概念及心得
    给Eclipse_Android添加智能提示功能
    C#异步编程之:(三)使用TaskScheduler.UnobservedTaskException
    类设计技巧
    初始化块
    子类构造器
    静态域与静态方法
    构造器中调用另一个构造器
    重载
    无参数的构造器
  • 原文地址:https://www.cnblogs.com/daweige/p/8295180.html
Copyright © 2020-2023  润新知