持久化——非功能性需求
表1. 支持JPA的应用服务器以及 JPA实现途径
|
应用服务器
|
JPA 实现
|
|
JBoss
|
Hibernate
|
|
BEA
|
Kodo (OpenJPA)
|
|
Oracle
|
TopLink
|
|
Glassfish
|
TopLink
|
从表中可看出,Spring和EJB都有可选的持久化服务提供程序。如果要在应用中使用超出JPA规范的某种产品的专有特性,可以在EJB应用中实现,但这是以牺牲跨平台兼容性为代价的。
ORM另一个重要的概念是缓存。若使某单元内的各个组件协同工作,必须使缓存在各组件间得以共享。基于Spring的应用一般通过线程内局部变量将session(以及事务)和线程绑定起来。尽管Spring内置了处理缓存的一系列类,仍需开发人员处理具体的环节。而EJB 3.0则在事务对象上自动生成持久化场景。对象模型通常很复杂,如果每当持久化实体对象从数据库中提取时都自动生成其所有的相关关系,那么处理效率会非常低。针对这一点,ORM工具提供了延迟初始化机制。这种机制只有在数据确实需要时,才执行相关的数据库操作。这样确实避免了不必要且昂贵的数据库访问操作,但也使应用逻辑变得复杂化。需要注意的是,当试图访问一个延迟初始化的对象集合而其缓存已经关闭时,则就会抛出异常。
Spring/Hibernate组合的处理方式是在视图生成前打开缓存,生成后立即将缓存关闭。Spring 中的OpenSessionInViewFilter类(和拦截器)用于简化以上操作,在使用前需要配置。EJB 3.0规范在持久化场景中增加了有趣的范畴,允许缓存生存周期与状态会话 bean的生命周期进行绑定。这样可简化对于长周期应用事务和延迟加载集合对象的处理。
持久化——小结
JPA支持可插入式的持久化提供程序,Spring也支持同样的程序。表二列出了两者主要的特性对比。
表2. Spring 和 EJB 3.0的持久化机制对比
|
特性
|
Spring
|
EJB 3.0
|
|
Simple ORM Persistence
简单对象-关系映射
|
√
|
√
|
|
Implementation
实现
|
Hibernate,JPA,JDO, TopLink, iBatis
|
JPA (提供程序包括 Hibernate, Kodo and Toplink)
|
|
是否支持JDBC
|
√
|
--
|
|
映射
|
XML, 注释
|
注释, XML
|
|
Cache Propagation
缓存生成
|
本地线程
|
事务
|
|
扩展缓存范围
|
在视图中打开session
|
在扩展持久化场景中
|
|
标准化
|
√(是否使用JPA)
|
√
|