限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

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

  • 2008-08-28
  • 本文字数:1449 字

    阅读完需:约 5 分钟

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

2008-08-28 02:47797
用户头像

发布了 88 篇内容, 共 269.3 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

跟着卷卷龙一起学Camera--信号采样01

卷卷龙

ISP camera 11月月更

一文了解openEuler SIG组角色划分与管理运作

openEuler

开源

设计模式之美-面向对象、设计原则、设计模式、编程规范、重构的关系

GalaxyCreater

设计模式

MySQL能力全开放,OceanBase 社区版 4.0 正式上线

OceanBase 数据库

史海峰:成为技术领导者 从技术到管理的必经之路丨声网开发者创业讲堂 • 第 5 期

声网

技术管理 人工智能’

跟着卷卷龙一起学Camera--信号采样02

卷卷龙

ISP camera 11月月更

promise执行顺序面试题令我头秃,你能作对几道

loveX001

JavaScript

设计模式之美-代码评价标准

GalaxyCreater

设计模式

我上了个假“中台”!

雨果

数据中台

企业级业务架构设计:方法论与实践 学习笔记

程序员架构进阶

业务架构 TOGAF 11月日更 Zachman

js异步编程面试题你能答上来几道

loveX001

JavaScript

Vue组件入门(十五)异步组件

Augus

vue3.0 11月月更

433MHz自发电无线控制器

不脱发的程序猿

物联网 嵌入式 无线通信 ​433MHz自发电无线开关

2022-11-03:给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果arr[i] != 0,表示i这里已经确

福大大架构师每日一题

算法 rust 福大大

从2开始,在Go语言后端业务系统中引入缓存

闫同学

Go 设计 后端 11月月更

圆满落幕!回顾 eBPF 技术的发展与挑战

OpenAnolis小助手

Linux 云原生 ebpf 云栖大会 龙蜥社区

跟着卷卷龙一起学Camera--MIPI 03

卷卷龙

ISP camera 11月月更

如何在知乎平台上做营销推广:推荐几种引流方式

石头IT视角

专访微盟CTO黄骏伟:WOS将为去中心化商业提供一整套数字基建

B Impact

StarRocks 技术内幕 | Join 查询优化

StarRocks

数据库

Linux中 dir 命令还能这样玩!

wljslmz

Linux 11月月更

Ansible 部署的时候提示错误 SSH password instead

HoneyMoose

简述机器学习库

穿过生命散发芬芳

机器学习 11月月更

一次基于Fastjson的JNDI注入

网络安全学海

网络安全 安全 信息安全 渗透测试 漏洞挖掘

从0开始,用Go语言搭建一个简单的后端业务系统

闫同学

后端 go语言 11月月更

这样回答前端面试题才能拿到offer

loveX001

JavaScript

详解CAN总线:CAN总线通信优先级机制

不脱发的程序猿

汽车电子 CAN总线 详解CAN总线 CAN总线通信优先级机制 CAN优先级

互联网安全体制的挑战与机遇

阿泽🧸

互联网安全 11月月更

📢利用Vite插件助力证书安装

小鑫同学

前端 插件 11月月更

极速体验docker容器健康

程序员欣宸

容器化 docekr 11月月更

从1开始,扩展Go语言后端业务系统的RPC功能

闫同学

后端 go语言 11月月更

Pratik Patel谈企业JPA、Fetch Groups及Spring 2.5_Java_Srini Penchikala_InfoQ精选文章