zoukankan      html  css  js  c++  java
  • hibernate session的常用方法解析

    1)persist()方法和save()方法

         persist()方法是在Hibernate3版本中才出现的,实现了EJB3规范中定义的持久化语义,persist()方法不保证立即为持久化对象的OID赋值,而是有可能在Session清理缓存时才为OID赋值。

        session.save()方法并不立即执行SQL insert语句,只有当Session清理缓存时,才会执行SQL语句,如果在save()方法后,又修改了持久化对象的属性,清理缓存时会额外执行SQL update语句。

    (2)load()和get()方法

        都能根据给定OID从数据库中加载一个持久化对象.当数据库中不存在与OID对应的记录时,load()方法抛出org.hibernate.ObjectNotFoundException异常,而get()方法返回null.检索策略不同,默认情况下load()方法会采用延迟检索策略加载持久化对象,除非lazy=false,而get()方法总是采用立即检索策略.

        如果加载一个对象的目的是为了访问它的各个属性,可以用get()方法

        如果加载一个对象的目的是为了删除或建立与别的对象的关联关系,可以用load()方法.

    (3)update()方法

        只有在清理缓存的时候才会执行update语句,因此多次修改对象属性也只执行一次update.

    如果希望session仅当修改了对象的属性时,才执行update语句,可以把映射文件中<class>元素的select-before-update设为true,默认false,修改后会先执行select进行比较.

    (4)saveOrUpdate()方法

        如果传入参数是临时对象,调用save()方法,如果参数是游离对象,调用update()方法,如果参数是持久化对象,直接返回.

    如果满足以下情况之一,Hibernate把它当做临时对象,否则作为游离对象.

    1.Java对象的OID取值为null.

    2.Java对象具有version版本控制属性并且取值为null.

    3.在映射文件中为<id>元素设置了unsaved-value属性,并且Java对象的OID取值与这个unsaved-value属性值匹配

    4.在映射文件中为version版本控制属性设置了unsaved-value属性,并且Java对象的version版本控制属性的取值与映射文件中unsaved-value属性值匹配.

    5.为Hibernate的Interceptor提供了自定义的实现,并且Interceptor实现类的isUnsaved()方法返回Boolean.TRUE

    (5)merge()方法

       把一个游离对象的属性复制到一个持久化对象中.

    merge()方法处理流程:

    1.根据游离对象的OID到session缓存中查找匹配的持久化对象.

    2.如果在缓存中没有找到与游离对象的OID一致的持久化对象,就根据这个OID从数据库中加载持久化对象.如果在数据库中存在这样的持久化对象,就把游离对象的属性复制到这个刚加载的持久化对象中,计划执行一条update语句,再返回这个持久化对象的引用.

    3.如果merge()方法的参数是一个临时对象,那么也会创建一个新的对象,把临时对象的属性复制到这个新建的对象中,再调用save()方法持久化这个独享,最后返回这个持久化对象的引用.

    (6)delete()方法

       从数据库中删除一个Java对象,可以删除持久化对象,游离对象.

    delete()方法处理过程:

    1.如果参数是游离对象,先使游离对象被当前session关联,使它变为持久化对象.如果参数是持久化对象则忽略这一步.此步骤确保使用拦截器的场合下,拦截器能正常工作.

    2.计划执行一个delete语句

    3.把对象从Session缓存中删除,该对象进入删除状态.

    如果设置hibernate.use_identifier_rollback为true,delete()方法会把持久化对象或游离对象的OID置为null,使它们转变为临时对象,这样程序就可以重复使用这些临时对象了.

    --createQuery()方法:(暂略)

    (7)replicate()方法

    把一个数据库中的对象复制到另一个数据库中.

    第二个参数复制模式:

    ReplicationMode.IGNORE:如果在目标数据库中已经存在OID相同的对象,无操作.

    ReplicationMode.OVERWRITE:如果目标数据库中已经存在OID相同的对象,覆盖.

    ReplicationMode.EXCEPTION:如果目标数据库中已经存在OID相同的对象,抛异常.

    ReplicationMode.LAST_VERSION:如果目标数据库中已经存在OID相同的对象,比较两个对象的版本,新则覆盖,否则无操作.要求Hibernate采用的乐观锁并发控制.

    (8)session在清理缓存时,按如下顺序执行SQL语句

    按照应用程序调用session.save()方法的先后顺序,执行所有对实体进行插入的insert语句.

    执行所有对实体进行更新的update语句.

    执行所有对集合进行删除的delete语句.

    执行所有对集合元素进行删除,更新或者插入的SQL语句.

    执行所有对集合进行插入的insert语句.

    按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除的delete语句.

    如果对象使用native生成器来生成OID,那么当调用sessionsave()方法保存该对象时,会立即执行向数据库插入该实体的insert语句

    (9)默认情况下,session会在以下时间点清理缓存

    1>当应用程序调用org.hibernate.Transaction的commit()方法时候,先清理缓存,再向数据库提交事务.

    2>当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,就会先清理缓存,使session缓存与数据库同步,保证查询结果正确.

    3>当应用程序显示调用session的flush()方法时.

     

    改变清理缓存时间点

    session.setFlushMode(FlushMode.COMMIT)

    清理缓存的模式

    各种查询方法

    Transaction的commit()

    Session的flush()

    FlushMode.AUTO(默认)

    清理

    清理

    清理

    FlushMode.COMMIT

    不清理

    清理

    清理

    FlushMode.NEVER

    不清理

    不清理

    不清理

  • 相关阅读:
    C++ for循环遍历几种写法
    Windwos查看本地局域网内所有的ip方法
    c define
    ssh
    Linux的iptables菜鸟初学
    nc命令的用法
    电脑莫名重启,VS代码丢失的解决办法
    string判断是否是正常的ip格式
    机器学习之推荐算法
    Springboot将mybatis替换为mybatis-plus
  • 原文地址:https://www.cnblogs.com/sunliqing/p/3445023.html
Copyright © 2011-2022 走看看