文档介绍:第15章 Hibernate高级应用
Hibernate不仅仅是一个简单的OR Mapping工具。对于开发数据库应用程序经常遇到的一些复杂问题Hibernate也提供了很好的支持。如提高程序性能、保证数据完整性、监控对数据库的操作等等。这些都是很实用的功能归纳在本章,相对于前面的基本功能称为高级应用。
批量处理
如果想使用Hibernate将100000条记录插入到数据库的一个很自然的做法可能是这样的:
这段程序大概运行到50 000条记录左右会失败并抛出内存溢出异常(OutOfMemoryException)。这是因为Hibernate把所有新插入的人员(Person)实例在session级别的缓存区(一级缓存)进行了缓存的缘故。本节就将解答如何解决这样的问题。
及时清理session缓冲区
既让是session的缓冲区溢出,首先想到的就是如何及时清理这个缓冲区,在溢出之前请空它。
(1)设置JDBC SIZE。
(2)清理缓存。
(3)检索和更新。
使用无状态session接口
Hibernate提供了基于命令的API--StatelessSession,可以用detached object的形式把数据以流的方法加入到数据库,或从数据库输出。StatelessSession没有持久化上下文,也不提供多少高层的生命周期语义。特别是,无状态session不实现第一级cache,也不和第二级缓存,或者查询缓存交互。它不实现事务化写,也不实现脏数据检查。用StatelessSession进行的操作甚至不级联到关联实例。它忽略集合类(Collections)。通过stateless session进行的操作不触发Hibernate的事件模型和拦截器。无状态session对数据的混淆现象免疫,因为它没有第一级缓存。
使用HQL的批量语句
Hibernate3增加了使用HQL 语句批量的update 和delete 语法,语法格式如下:
update | delete from? ClassName [where where_conditions]
关于上面的语法格式有以下4点值得注意:
在from子句中,from关键字是可选的。即完全可以不写from 关键字。
在from子句中只能有一个类名,该类名不能有别名。
不能在批量HQL 语句中使用连接,显式的或隐式的都不行。但可以在where 子句中使用子查询。
整个where 子句是可选的。
事务与并发处理
事务和并发是开发数据库应用程序两个重要概念,在业务逻辑中这两个概念也是不可避免的要遇到的。对程序的效率关系特别大。Hibernate为解决这些问题,提供了很好支持。
事务简介
事务是一步或几步基本操作组成的逻辑执行单元,这些基本操作作为一个整体执行单元,它们要么全部执行,要么全部取消,绝不能仅仅执行部分。一般而言,每次用户请求,对应一个业务逻辑方法,一个业务逻辑方法往往具有逻辑上的原子性,应该使用事务。例如,一个转账操作,对应修改两个账户的余额,这两个账户的修改要么同时生效,要么同时取消——同时生效是转账成功,同时取消是转账失败;但不可只修改其中一个账户,那将破坏数据库的完整性。
使用JDBC事务
首先介绍一下JDBC中事务。在JDBC中,可以用Connection来管理事务,mit设定为false,在下达一连串的SQL语句后,mit()来送出变更,如果中间发生错误,则撤消所有的执行,
使用JTA事务
如果在EJB中使用Hibernate,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTATransaction。JTA 事务管理则由JTA 容器实现,JTA 容器对当前加入事务的众多Connection 进行调度,实现其事务性要求。JTA的事务周期可横跨多个JDBC Connection生命周期。同样对于基于JTA事务的Hibernate而言,JTA事务横跨可横跨多个Session。所以不是由Session来开始事务,
数据操作的异常处理
如果Session抛出异常(包括任何SQLException),应该立即回滚数据库事务,调用 () ,丢弃该Session实例。Session的某些方法可能会导致session处于不一致的状态。所有由Hibernate抛出的异常都视为不可以恢复的。确保在 finally 代码块中调用close()方法,以关闭掉Session。
HibernateException是一个非检查期异常(),它封装了Hibernate持久