一、与触发器协同工作
  当Hibernate与数据库的触发器协同工作时,会出现以下两类问题:
  1、触发器使Session缓存中的数据和数据库中的不一致
    出现此问题的原因是触发器运行在数据库内,它执行的操作对Session是透明的。
    解决方案:在执行完包含有触发器的操作之后,立刻调用Session的flush()和refresh()方法,迫使Session的缓存与数据库同步。
  2、Session的update()方法盲目的激发触发器
    这种情况主要发生在Session调用update()或saveOrUpdate()方法时,能够使一个游离对象和Session关联,此时由于缓存中不存在该对象的快照,因此肯定会执行一次update语句,进而激发触发器。如果该对象的属性和数据库中的数据一致,那么该update语句就是多余的。要避免此种情况,在<class>元素中设置select-before-update="true"即可。
二、利用拦截器生成审计日志:暂不关注。
三、Hibernate事件处理机制
  Hibernate3的核心处理模块采用了“事件\监听器”设计模式。
  Session的大部分方法都会触发特定事件,该事件由相应的监听器来处理。
  在org.hibernate.event包中提供了与Session的各个方法对应的事件类及监听器接口。
  创建及注册客户化监听器方法的一般步骤:
  1、创建客户化监听器
    A、直接实现特定的监听器接口。
    B、继承Hibernate提供的监听器接口的基础实现类,比如org.hibernate.enent.def.AbstractSaveEventListner.
    C、继承Hibernate提供的监听器接口的默认实现类。比如org.hibernate.event.def.DefaultSaveEventListner.
  2、注册客户化监听器:2种方式
    A、在Hibernate的配置文件hibernate.cfg.xml中静态注册。

<event type="load">
<listener class="mypack.MyLoadListener" />
</event>

    B、在程序中动态注册:可以注册多个。

Configuration cfg = new Configuration();
LoadEventListener[] listeners = {new MyLoadListener(),...};
cfg.getEventListeners().setLoadEventListeners(listeners);

四、批量处理数据
  批量操作带来的问题:
    A、占用大量内存,比如批量更新,需要把大量的对象先加载到内存中,然后一一更新。
    B、执行的更新语句的数目太多。
  因此,应该尽量避免在应用层进行批量操作,而应该在数据库层直接进行批量操作。若要在应用层执行批量操作,有以下四种方式:
  1、通过Session来进行批量操作
    此种做法是在处理完一个对象或一小批对象之后,立刻调用flush()方法清理缓存,然后调用clear()方法清空缓存。
    需要注意:
      合理设置hibernate.jdbc.batch_size属性。
      如果对象采用identity标识符生成器,则Hibernate无法再JDBC层进行批量插入操作。
      进行批量操作时,建议关闭二级缓存。
  2、通过StatelessSession来进行批量操作:用法和Session类似。
  3、通过HQL来进行批量操作:Query.executeUpdate()
  4、直接通过JDBC API来进行批量操作
五、使用元数据
  通过SessionFactory.getClassMetadata()和getCollectionMetadate()可以获取相应的对象来操纵元数据。
六、执行存储过程:参见JDBC的方式。

(声明:该文所有内容均来自《精通Hibernate:Java对象持久化技术详解》[孙卫琴 电子工业出版社] 一书。该文的目的仅仅作为学习笔记。若需要转载,请注明原书相关信息。)

攻城狮在路上(壹) Hibernate(七)--- 通过Hibernate操纵对象(下)的更多相关文章

  1. 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)

    Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...

  2. 攻城狮在路上(壹) Hibernate(六)--- 通过Hibernate操纵对象(上)

    一.Hibernate缓存简介: Session接口是Hibernate向应用程序提供的操纵数据接口的最主要接口,它提供了基本的保存.更新.删除和加载Java对象的方法. Session具有一个缓存, ...

  3. 攻城狮在路上(壹) Hibernate(四)--- 对象标识符(OID)生成机制

    Hibernate使用对象标识符(OID)来建立内存中对象和数据库表中记录的对应关系,对象的OID和数据库的主键对应.为了保证OID的唯一性和不可变性,应该让Hibernate来为OID赋值.Hibe ...

  4. 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存

    一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...

  5. 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务

    一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...

  6. 攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型

    Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性.分为两种:内置映射类型和客户化映射类型.一.内置映射类型: 1.Java基本类型的Hibernate映射类型: Ja ...

  7. 攻城狮在路上(壹) Hibernate(二)--- 第一个hibernate程序

    1.直接通过JDBC API持久化实体域对象: A.java.sql常用接口和类: DriverManager:驱动程序管理器,负责创建数据库连接. Connection:代表数据库连接. State ...

  8. 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略

    本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...

  9. 攻城狮在路上(壹) Hibernate(三)--- 属性访问、命名策略、派生属性、指定包名等

    一.hibernate访问持久化类属性的策略: 在<property>元素中的access属性用于指定Hibernate访问持久化类属性的方式. 常见的方式如下: 1.property:默 ...

随机推荐

  1. bootstrap框架-----可见 隐藏

    可见框架-像素选择 -block-inline  :块内联元素 -inline-block将对象呈递为内联对象,但是对象的内容作为块对象呈递.旁边的内联对象会被呈递在同一行内,允许空格 可以设置宽度和 ...

  2. Java对象访问 类的静态变量

    Java类的静态变量用对象和类名都能访问,一般用类名,但如果用对象来访问静态变量呢,有何种效果? 测试一下: package JavaTest; public class test{ public s ...

  3. Docker与LXC的区别

    转自: http://blog.csdn.net/wangtaoking1/article/details/45043523 Docker并不是LXC的替代品,Docker的底层就是使用了LXC来实现 ...

  4. C#函数参数

    当函数接受参数时,必须指定下属内容 函数在其定义中指定参数列表,以及这些参数的类型 在每个函数调用中匹配参数列表 参数匹配:当调用函数时,必须使参数与函数定义中指定的参数完全匹配,这意味着要匹配参数的 ...

  5. POJ 1002

    #include <stdio.h> #include <string.h> #include <stdlib.h> struct In{ int a; ]; }p ...

  6. iOS App Extensions 推荐文章

    写的非常不错,读完后,基本的extension的套路就清楚了,也是我们的园友写的,感谢他: http://www.cnblogs.com/xdream86/p/3855932.html 下面这个教程是 ...

  7. mybatis参数错误 Parameter '×××' not found. Available parameters are [0, 1, param1, param2]

    报错的代码 @Update("update staff_info set ApplyState = #{applyState} where Id = #{userId}") int ...

  8. Android 支付宝以及微信支付快速接入流程

    简介 随着移动支付的普及,越来越多的App采用第三发支付,在这里我们以支付宝为例,做一个快速集成! 一.Android快速实现支付宝支付 1.首先,我们需要前往支付宝开放平台,申请我们的支付功能:ht ...

  9. iOS -类目,延展,协议

    1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray ( ...

  10. GCD的使用

    什么是 GCD Grand Central Dispatch (GCD) 是 Apple 开发的一个多核编程的解决方法.该方法在 Mac OS X 10.6 雪豹中首次推出,并随后被引入到了 iOS4 ...