2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

JPA 2.2 改进了易用性

  • 2018-01-18
  • 本文字数:1901 字

    阅读完需:约 6 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

Oracle最近发布 Java Persistence API (JPA)2.2 版。JPA 规范用于将 Java 对象持久化映射到关系数据库中。

作为 Java EE 8 平台的组成部分,JPA 2.2 中添加了对一些新特性的支持,包括查询结果的流处理、将 ManagedBeans 注入 AttributeConverters、重复注解(Repeating Annotations),以及操作 Java 8 日期 / 时间 API 中的类等。虽然更改为数不多,但是特点显著,因为 JPA 2.2 是首个以 Java 8 为基线的版本。

在《Java Magazine》11 月 /12 月合刊(第 17 期)上,发表了 Josh Juneau 的文章“ What’s New in JPA 2.2 ”。文中指出:

最终,JPA 与 Java SE 8 保存了一致。它支持开发人员使用日期 / 时间 API、查询结果流和重复注解等特性。

查询结果流

JPA 在QueryTypedQuery接口中,添加了getResultStream()方法。使用这一改进,查询可返回一个结果流,这提供了一种操作数据的便利方法。在 JPA 2.2 之前,查询只能返回一个列表。使用新的流方法的示例代码如下:

复制代码
Stream<Stock> stocks = entityManager
.createNamedQuery(Stock.FIND_HIGH_PERFORMERS, Stock.class)
.getResultStream();
stocks.filter(...)

流处理提高了数据库查询的性能。但是在一些情况下,我们会需要操作一些大规模的数据集,这时ResultSet分页的执行效果可能会更好。一些持久化方法同样考虑到了性能上的需求,并提供了更好的getResultStream()实现。面对大规模数据流时,开发人员应考虑性能问题。

可注入的 AttributeConverter

JPA 2.2 中添加了将 ManagedBeans 注入到 AttributeConverter 的特性。该特性是使用标注上下文和依赖注入(CDI,Contexts and Dependency Injection)给出的@Inject注解实现的。使用该特性,可在必要时将 CDI 资源注入到任一 AttributeConverter。示例代码如下:

复制代码
@Converter(autoApply = true)
public class TheAttributeConverter implements AttributeConverter<TheObject, String> {
@Inject
private MyUtils utils;
@Override
public TheObject convertToEntityAttribute(String s) {
return utils.toTheObject(s);
}
@Override
public String convertToDatabaseColumn(TheObject obj) {
return utils.toString(obj);
}
}

可重复注解

在 Java 8 中,如果一个注解使用@Repeatable定义了容器注解(Container Annotation),那么该注解就是可重复的。可重复注解允许类、方法或属性上的同一注解对应于多个实例。JPA 2.2 指定了下列注释是可重复的:

  • AssociationOverride
  • AttributeOverride
  • Convert
  • JoinColumn
  • MapKeyJoinColumn
  • NamedEntityGraph
  • NamedNativeQuery
  • NamedQuery
  • NamedStoredProcedureQuery
  • PersistenceContext
  • PersistenceUnit
  • PrimaryKeyJoinColumn
  • SecondaryTable
  • SqlResultSetMapping

这一改进使开发人员不再需要指定容器注释,提高了代码的可读性,进而支持编写如下的构造:

复制代码
@Entity
@NamedQuery(name = "Stock.findBySymbol", query = "SELECT s FROM Stocks s WHERE s.symbol = :symbol")
@NamedQuery(name = "Stock.findByDate", query = "SELECT s FROM Stocks s WHERE s.date = :date")
@NamedQuery(name = "Stock.findByPrice", query = "SELECT s FROM Stocks s WHERE s.price = :price")
public class Stock {
...
}

支持 Java 8 的日期 / 时间

JPA 2.2 提供了基本的 Java 8 日期 / 时间类型支持,包括对下列java.time中类的映射:

  • LocalDate
  • LocalTime
  • LocalDateTime
  • OffsetTime
  • OffsetDateTime

与 JPA 以前版本的不同之处在于,2.2 版中不再需要编写 AttributeConverter 去执行数据库和 Java 8 间日期 / 时间类型的相互映射。由于 JPA 内置了对 Java 日期 / 时间 API 的支持,因此在使用上述五种受支持的类型时,不需要再做任何额外的工作,只需插入到想要的现有 API 中即可。示例代码如下:

复制代码
@Entity
public class Stock implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID", updatable = false, nullable = false)
private Long id;
@Column(name="LAST_BUY_DATE")
private LocalDate lastBuyDate;
@Column(name="LAST_BUY_TIME")
private LocalDateTime lastBuyTime;
}

由于这些改进是 Java EE 8 平台组成部分,因此当前只有兼容 Java EE 8 的应用服务器才能提供这些服务。但是对于较早的 Java EE 版本,可以简单地通过在项目中包含相应的 JAR 文件,使用这些新特性。

更多细节,参见 Java Persistence 2.2 维护版的发行说明。

查看英文原文: Handy Improvements in JPA 2.2

2018-01-18 18:006699
用户头像

发布了 391 篇内容, 共 146.5 次阅读, 收获喜欢 257 次。

关注

评论

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

数据库审计部署方式有哪些?哪种比较好?

行云管家

数据库 数据库审计 数据库审计部署

官宣|九章云极DataCanvas核心产品通过 “可信大数据”权威评测

九章云极DataCanvas

人工智能 大数据 数据处理 中国信通院 实时决策

五个核心能力打造普惠金融商业化发展模式

易观分析

普惠金融

百家号基于AE的视频渲染技术探索

百度Geek说

视频 视频渲染

【愚公系列】2022年7月 Go教学课程 010-数据类型之布尔型和字符类型

愚公搬代码

7月月更

项目进度管理和风险管理记录

老猎人

一文搞懂│工厂模式、单例模式、策略模式、适配器模式、观察者模式的原理和使用

设计模式 策略模式 观察者模式 适配器模式 7月月更

ShardingSphere 云上实践:开箱即用的 ShardingSphere-Proxy 集群

SphereEx

数据库 云原生 ShardingSphere

易观分析加入智能投研技术联盟,共促行业数智化发展

易观分析

易观新闻

DNS稳定性建设实战-从主机到k8s

boaker

k8s DNS 成本优化 DNS故障 稳定性保障

TiFlash 面向编译器的自动向量化加速

PingCAP

TiDB

APISIX 如何与 Hydra 集成,搭建集中认证网关助力企业安全

API7.ai 技术团队

云原生 网关 身份验证 APISIX 网关

leetcode 455. Assign Cookies 分发饼干(简)

okokabcd

LeetCode 数据结构与算法 贪心算法

数据库审计和日志审计的三大区别分析

行云管家

数据库 日志 日志审计 数据库审计

JS 逆向 SMZDM 的登录加密,你学过全文扣JS代码解密吗?

梦想橡皮擦

Python 爬虫 7月月更

干货分享 | 数据仓库如何应对资源不足?9招解除故障

雨果

数据仓库

想低成本保障软件安全?5大安全任务值得考虑

SEAL安全

安全左移

互联网裁员潮来袭,这5类职场人最容易被淘汰

雨果

互联网裁员

大数据培训Spark数据倾斜问题的解决方法

@零度

spark 大数据开发

内行,阿里大牛离职带出内部“高并发系统设计”学习手册

程序知音

Java 阿里巴巴 程序员 后端 高并发

关于微软 Edge 浏览器的 Tracking Prevention 特性在 Angular 应用中的影响

汪子熙

JavaScript typescript Web web开发 7月月更

国产EDA验证调试工具实现破局 助力芯片设计效率提升

科技热闻

2022年中国互联网医疗年度盘点

易观分析

互联网医疗

阿里云第四届全球数据库大赛火热开赛,40万奖金广纳英才

科技热闻

『51单片机』十分钟学会定时器

謓泽

7月月更

Python|分析QQ群聊信息,记录词频并制作词云

AXYZdong

Python 7月月更

揭露数据不一致的利器 —— 实时核对系统

Shopee技术团队

数据分析 后端

小程序表单组件-1

小恺

7月月更

得物App数据模拟平台的探索和实践

得物技术

大前端 方案设计 Mooncake 数据模拟平台

java培训如何防止 jar 被反编译

@零度

JAVA开发 jar被反译

JAVA编程规范之命名风格

源字节1号

软件开发

JPA 2.2改进了易用性_Java_Kesha Williams_InfoQ精选文章