zoukankan      html  css  js  c++  java
  • 举例理解Hibernate的三种状态(转)

    转自:https://blog.csdn.net/yiguang_820/article/details/79073152

    初学Hibernate,了解到Hibernate有三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(游离状态)。

      它们之间有如下转换图来说明:

      

     1.临时对象(Transient):

    • 在使用代理主键的情况下,OID通常为null
    • 不处于Session的缓存中
    • 在数据库中没有对应的记录


    2.持久化对象(也叫“托管”)(Persist):

    • OID不为null
    • 位于Session缓存中
    • 若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
    • 在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象


    3.删除对象(Removed):

    • 在数据库中没有和其OID对应的记录
    • 不再处于Session缓存中
    • 一般情况下,应用程序不该再使用被删除的对象

    4.游离对象(也叫“托管”)(Detached):

    • OID不为null
    • 不再处于Session缓存中
    • 一般情况下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在于它对应的记录
     
    Session的update()方法:
    • Session的update()方法使一个游离对象转变为持久化对象,并且计划执行一条update语句。
    • 若希望session仅当修改了News对象的属性时,才执行update()语句,可以把映射文件中<class>元素的select-before-update设为true,该属性的默认值为false。(一般不使用,只有在和出发协同工作时才会设置,以防出现问题)
    • 当update()方法关联一个游离对象时,如果在Session的缓存中已经存在相同OID的持久化对象,会抛出异常
    • 当update()方法关联一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常
     
    Session的saveOrUpdate()方法:
    1.Session的saveOrUpdate()方法同时包含了save()与update()的功能
    • News对象如果是游离对象,则执行update()方法;如果是临时对象,则执行save()方法。
    2.判定对象为临时对象的标准
    • Java对象的OID为null
    • 映射文件中<id>设置了 unsaved-value属性,并且Java对象的OID取值与这个unsave-value属性值匹配
     
    Session的merge()方法:
     
    Session的delete()方法:
    1.Session的delete()方法既可以删除一个游离对象,也可以删除一个持久化对象
    2.Session的delete()方法处理过程
    • 计划执行一条delete语句
    • 把对象从Session缓存中删除,该对象进入删除状态
    3.Hibernate的.cfg.xml配置文件中有一个hibernate.use identifier rollback属性,其默认值为false,若把它设为true,将改变delete()方法的运行行为:delete()方法会把持久化对象或游离对象的OID设置为null,使它们变为临时对象
     
     
    通过Hibernate调用存储过程
    1.Work接口:直接通过JDBC API来访问数据库的操作
    public interface Work{
    public void execute(Connection connection) throw SQLException;
    }
    2.Session的doWork(Work)方法用于执行Work对象指定的操作,即调用Work对象的excute()方法,Session会把当前使用的数据库连接传递给execute()方法
    public void testDoWork() {
    session.doWork(new Work() {


    @Override
    public void execute(Connection arg0) throws SQLException {
    System.out.println(arg0);

    //调用存储过程
    }

    });

    Hibernate与触发器协同工作

    Hibernate与数据库中的触发器协同工作时,会造成两类问题:

    • 触发器使Session的缓存中的持久化对象与数据库中对应的数据不一致:触发器运行在数据库中,它执行的操作对Session是透明的
    • Session的update()方法盲目地激发触发器:无论游离对象的属性是否发生变化,都会执行update语句,而update语句会激发数据库中相应的触发器

    解决方法:

    • 在执行完Session的相关操作后,立即调用Session的flush()和refresh()方法,迫使Session的缓存与数据库同步()refresh()方法重新从数据库中加载对象)
      • 在映射文件的<class>元素中设置select-before-update属性:当Session的update或saveOrUpdate()方法更新一个游离对象时,会先执行Select语句,获得当前游离对象在数据库中的最新数据,只有在不一致的情况下才会执行update语句。
  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/pingxin/p/p00030.html
Copyright © 2011-2022 走看看