zoukankan      html  css  js  c++  java
  • Hibernate Session对象核心方法

     1. 持久化对象的状态:

      站在持久化的角度,Hibernate 把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态

      Session 的特定方法能使对象从一个状态转到另一个状态

      临时对象:

        在使用代理主键的情况下,OID 通常为 null

        不处于 Session 的缓存中

        在数据库中没有对应的记录

      持久化对象(也叫托管):

        OID 不为 null

        位于 Session 缓存中

        若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应

        Session 在 flush 缓存时,会根据持久化对象的属性变化,来同步更新数据库

        在同一个 Session 实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象

      删除对象:

        在数据库中没有和其 OID 对应的记录

        不再处于 Session 的缓存中

        一般情况下,应用程序不该再使用被删除的对象

      游离对象(也称“脱管”):

        OID 不为 null

        不再处于 Session 缓存中

        一般情况下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录

    Session  中的方法:

      save 方法:

        1. 是一个临时对象变为持久化对象

        2. 为对象分配 ID 

        3. 在 flush 刷新缓存时会发送一条 INSERT 语句

        4. 在 save 方法之前配置的 ID 是无效的

        5. 持久化对象的 ID 是不能被修改的

      persist 方法:

        与 save 方法类似

        与 save 方法的区别:在调用 persist 方法之前,若对象已经有 ID 了,persist 方法会抛出异常;而 save 不会

      get & load 方法:

        get 和 load 方法都能从数据库中获取记录

        区别:

          1. 执行 get 方法:会立即加载对象

              执行 load 方法:若不使用该对象,则不会立即执行查询操作,而返回一个代理对象

            get 是立即检索

            load 是延迟检索

          2. 若数据表中没有对应的记录

            get 返回 null

            在使用对象的时候 load 会抛出异常(因为 load 方法开始的时候是返回了一个代理对象,所以如果没有查找到记录,那么就会抛出异常)

          3. load 方法可能会抛出懒加载异常

            比如,在初始化代理对象之前,关闭了 Session

      

      update 方法:

        1. 若更新一个持久化对象,不需要显式的调用 update 方法,因为在调用 Transaction 的 commit 方法时,会先执行 Session 的 flush 方法

        2. 更新一个游离对象,需要显式的调用 Session 的 update 方法。update 方法可以把一个游离对象变为持久化对象。

        注意:

          1. 无论要更新的游离对象和数据表的记录是否一致,都会发送 UPDATE 语句。

           可以通过设置 .hbm.xml 文件的 class 节点设置 select-before-update=true(默认为false),但通常不需要设置该属性

          2. 若数据表中没有对应的记录,但调用了 update 方法,会抛出异常

          3. 当 update 方法关联一个游离对象时,如果 Session 的缓存中已经存在相同 OID 的持久化对象,会抛出异常, 因为在 Session 缓冲中不能有两个 OID 相同的对象!

      saveOrUpdate 方法:

        该方法同时包含了 save 与 update 方法的功能

          如果对象是游离对象,则执行 update 方法

          如果对象是临时对象,则执行 save 方法

        判断对象是游离对象还是临时对象的标准: java 对象的 OID 是否为 null

        注意:若对象的 OID 不为 null,但数据表中还没有和其对应的记录,会抛出一个异常

        了解:OID 值等于 id 的 unsaved-value 属性值的对象,也被认为是一个游离对象 

      delete 方法:

        执行删除操作,只要 OID 和数据表中一条记录对应,就会准备执行 DELETE 操作,若 OID 在数据表中没有对应的记录,则抛出异常

        对象被删除后,由于 OID 还保存在对象中,所以不能进行 update 和 save 操作,但是可以通过设置 hibernate 配置文件中的 hibernate.use_identifier_rollback 属性为 true,使删除对象后,对象的 OID 置为 null

        

      evict 方法:

        从 Session 缓存中把指定的持久化对象移除

  • 相关阅读:
    (OK) [android-x86-6.0-rc1] grub
    /proc/sys/net/ipv4/conf/*/promote_secondaries
    (OK) Ipsysctl tutorial 1.0.4
    Android Netd ndc (Native Daemon Connector)
    Android Wi-Fi — IP forward — ndc — netd
    Android 网络问题
    有哪些 Android 大牛的 blog 值得推荐?
    Android 4.4 Kitkat 使能有线网络 Ethernet
    IP forwarding failure in android 4.0
    (OK) [android-x86-6.0-rc1] /system/etc/init.sh
  • 原文地址:https://www.cnblogs.com/zyx1301691180/p/7683678.html
Copyright © 2011-2022 走看看