写点什么

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:006908
用户头像

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

关注

评论

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

低代码崛起:让程序员饭碗不保?人工智能或成“帮凶”

加入高科技仿生人

人工智能 低代码 数智化

传统软件如何SaaS化改造,10个问答带你掌握最优解

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 6 月 PK 榜

KW 新闻 | KaiwuDB 亮相数字中国并发布离散制造场景解决方案

KaiwuDB

数字中国 KaiwuDB 离散制造业解决方案

什么是低代码(Low-Code)?

优秀

低代码 低代码Low-Code 低代码是什么

破防了!阿里用17个真实企业级项目阐述Java系统分析与架构设计

互联网架构师小马

Java 架构设计 系统分析

QCon高分演讲:火山引擎容器技术在边缘计算场景下的应用实践与探索

火山引擎边缘云

边缘计算 容器技术 实践 火山引擎边缘云

Postman Runner 中的参数自增技巧

Liam

Java Postman API 接口开发 接口工具

人民日报:天翼云持续拓展云网基础设施覆盖广度和深度

天翼云开发者社区

云计算

政务云建设提速,天翼云夯实智慧政务数字底座

天翼云开发者社区

云计算 大数据

万字长文解析,领域驱动设计(DDD)落地设计

codebee

“大模型+小模型”新纪元开启,AI基础软件定义AI未来

九章云极DataCanvas

翻车了,被读者找出 BUG

捉虫大师

Go 性能优化

低代码赛道拥挤 生态聚合成为破局关键

力软低代码开发平台

微服务高并发:授权与系统自适应功能的实现原理

互联网架构师小马

授权 系统自适应

程序员晋升指南!13年顶级架构设计经验的锦囊妙计与实践分享

互联网架构师小马

Java 架构

瓴羊Quick BI:轻松实现数据可视化大屏

对不起该用户已成仙‖

AI在线问题回答输出

xushuanglu

AI

CloudOps自动化运维套件助力企业更好上云、用云、管云

阿里云弹性计算

云计算 大数据 阿里云 物联网

Java获取本机IP

Geek_7ubdnf

蚂蚁集团变更管控平台 AlterShield 正式开源

TRaaS

GitHub 开源 蚂蚁集团 蚂蚁技术风险TRaaS

面试官:如何实现开关降级

互联网架构师小马

Java sentinel aop 开关降级

集结开发者力量,6月17日华为开发者联创日·深圳站即将启航!

说山水

【有奖调研】互联网新型社交,华为在找“元服务搭子”,快来集合!

HarmonyOS SDK

HMS Core

执行器-Query 执行详解

KaiwuDB

KaiwuDB Query执行

社交app源码技术屏幕的两大实用功能

山东布谷科技

App 软件开发 社交娱乐 源码实现

一文走进 SQL 编译-语义解析

KaiwuDB

KaiwuDB SQL编译

开发一次、运行多端:Weex与小程序容器的卓越优势解析

FinFish

Weex 跨端开发 小程序容器 跨端框架 跨端技术

如何修复 Mac 上的“未找到匹配的密钥交换方法”

背包客

macos SSH Mac 软件 mac电脑 macOS 13 Ventura

大模型热潮来袭,AI基础软件深度赋能金融行业数智化升级

九章云极DataCanvas

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