Pratik Patel 谈企业 JPA、Fetch Groups 及 Spring 2.5

  • Srini Penchikala
  • 张龙

2008 年 8 月 28 日

话题:Java语言 & 开发架构

Apache OpenJPA框架提供一些 JPA 扩张特性,比如 Fetch Groups 等,为企业 Java 开发者获取与 Java 对象所对应的数据的工作提供了更大的灵活性。Pratik Patel 阐述了如何结合JPA设计技术,使用 JPA API 和Spring 2.5框架来开发 Java 应用。在最近的 No Fluff Just Stuff(NFJS)俄亥俄州中心软件座谈会上,他就企业 JP 这一话题做了一次演讲

Pratik 谈到了如何为使用 JPA API 实现持久化的 Java 应用设计多个持久化单元(persistence units,即 PU),也谈到相关的性能调优技术。他提到EJB 3.0 Entities(正式的叫法是 Entity Beans)采用了基于“POJO 持久化”设计概念的 JPA。他说,在 Java 应用中使用供应商提供的特定扩展(比如“Fetch Groups”)来进行 JPA 开发是很有必要的。

Spring 2.5 框架与JPA 的集成良好,可以管理多个持久化单元,也可以通过一些 JPA 配置细节(如数据源)把 persistence.xml 迁移到 Spring 配置文件中,JPA 的配置也就更加灵活。在使用 Spring 配置 JPA 把大段代码分割为小模块的时候,开发人员就可以利用扩展点。同样,Spring Test模块对 JPA 类(如AbstractJpaTests)的单元测试、集成测试都提供很好的支持。AbstractJpaTests 类使用了一个后台 classloader 在运行时增强类,它围绕事务来包装测试方法,同时提供帮助类来声明应用上下文。Spring JPA 模块(LocalContainerEntityManagerFactoryBean)还可以在容器外对 JPA 逻辑进行单元测试。

谈到锁(locking),Pratik 说到 JPA 规范默认使用乐观锁(optimistic locking)。当然,开发者也可以自行使用悲观锁(pessimistic locking),但他们需要使用EntityManager的 lock() 或者 find() 方法来定义锁管理器。JPA 以基于“版本”的方式来跟踪内存中数据的更新,只需要在持久化类上加一个 @Version 属性,同时在数据库表中添加一个 Version 列。应当尽量避免使用悲观锁,因为它会影响吞吐量,而且很难从坏锁(bad locks)中恢复。

Pratik 以 Apache OpenJPA 框架提供的@FetchGroup@FetchPlan注解来举例说明 JPA API 的用法和性能调优。此外,他还谈到 fetching 逻辑的单元测试和集成测试,并且建议大家对 fetch groups 代码进行测试,这对应用投入到生产环境中的过程很有保障。

关于 JPA 的最佳实践,他希望开发者能考虑使用内存数据库(如HSQL DB)而不要再用 mock DAO 实现。虽然连接到内存数据库会多花点时间,但代码相对要少很多,开发代价也小。其它的最佳实践还包括检查生成的 SQL,这会使我们更深入了解 ORM 工具生成的 SQL 查询语句。另一件要考虑的是 DDL 的生成,因为所有的 JPA 实现都允许生成 DDL,这可以用来进行快速开发。在使用 JPA API 实现持久化时还需要考虑的其他一些事情如下:

  • 集合排序(JPA 2.0 将引入一个叫做 @OrderColumn 的新注解,定义用来比较的列)
  • 尽早且频繁地刷新缓存(Flush),同一事务中接下去的查询就不会再看到未刷新的数据
  • 枚举——数据库中速度与可读性的较量

在另一个与 JPA 相关的

演讲

中,Pratik 谈到了 JPA 查询语言(JPA Query Language,即 JPAQL),这种语言天生具有面向对象查询的特性,而且可以批量更新和删除。JPAQL 与其他查询语言如

JDOQL

HQL

等很相似,但功能要比 HQL 少。对于 lazy 关联,FETCH JOIN 表达式可以在取得主表数据的同时将关联的信息也一并取回。他还谈到了

JPA 2.0

规范的一些新特性:

  • “Criteria”查询
  • 针对基本类型的集合(Integer 和 String)
  • 扩展的 Map 支持
  • 更多 JPAQL 表达式 
  • 更好的锁支持

查看英文原文:Pratik Patel on Enterprise JPA, Fetch Groups and Spring 2.5

Java语言 & 开发架构