一、与触发器协同工作
  当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. Python自动化之sqlalchemy

    如果该数 据库支持 自增列 ,则 SQLAlchemy 默认 自动 设定 表中第一个 类型 为整形 的主键 为自增列 ORM介绍 orm英文全称object relational mapping,就是 ...

  2. 2016全国研究生数学建模A题多无人机协同任务规划——基于分布式协同多旅行商MTSP遗传算法

    MTSP问题是指:有Ⅳ个城市,要求旅行商到达每个城市各一次,且仅一次,并[旦 1到起点,且要求旅行路线最短.而多旅行商问题M个旅行商从同一个城市(或多个城市)出发.分羽走一条旅路线,且总路程缀短.有关 ...

  3. java导出生成word

    最近做的项目,需要将一些信息导出到word中.在网上找了好多解决方案,现在将这几天的总结分享一下. 目前来看,java导出word大致有6种解决方案: 1:Jacob是Java-COM Bridge的 ...

  4. MySQL 通过idb文件恢复Innodb 数据【转】

    昨晚收到一则求助,一个用户的本地数据库的重要数据由于误操作被删除,需要进行紧急恢复,用户的数据库日常并没有进行过任何备份,binlog也没有开启,所以从备份和binlog入手已经成为不可能,咨询了丁奇 ...

  5. UVALive 6577 Binary Tree 二叉树的LRU串

    今天继续攒人品...真开心啊O(∩_∩)O~~各种身体不舒服~~ https://icpcarchive.ecs.baylor.edu/external/65/6577.pdf 题意是这样的,现在有一 ...

  6. ASM:《X86汇编语言-从实模式到保护模式》第8章:实模式下硬盘的访问,程序重定位和加载

        第八章是一个非常重要的章节,讲述的是实模式下对硬件的访问(这一节主要讲的是硬盘),还有用户程序重定位的问题.现在整理出来刚好能和保护模式下的用户程序定位作一个对比. ★PART1:用户程序的重 ...

  7. Match:Censored!(AC自动机+DP+高精度)(POJ 1625)

     Censored! 题目大意:给定一些字符,将这些字符组成一个固定长度的字符串,但是字符串不能包含一些禁词,问你有多少种组合方式. 这是一道好题,既然出现了“一些”禁词,那么这题肯定和AC自动机有点 ...

  8. 【leetcode】Reverse Linked List II (middle)

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...

  9. 【leetcode】Best Time to Buy and Sell 2(too easy)

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  10. IOS - Objective-C NSArray和NSMutableArray的详解 使用

    原文地址:http://blog.csdn.net/totogo2010/article/details/7729377 Objective-C的数组比C++,Java的数组强大在于,NSArray保 ...