速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

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

关注

评论

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

技术分享必备de终端录制神器

小鑫同学

前端 Node 10月月更

混合云中合规管理的思考

HummerCloud

云安全 混合云 安全合规检测 10月月更

H5加载Android本地路径图片

小鑫同学

前端 Node 10月月更

Web3.0杂谈-#005(52/100)

hackstoic

元宇宙 Web3.0

Python进阶(十八)Python3爬虫小试牛刀之爬取CSDN博客个人信息

No Silver Bullet

Python 数据分析 10月月更

【分享】前端线上紧急排查工具

小鑫同学

前端 Node 10月月更

电商秒杀系统设计

张立奎

ReactNative-Android插件

小鑫同学

前端 Node 10月月更

Rust编程语言中的定义类型

小鑫同学

前端 Node 10月月更

JavaMail 使用POP3/SMTP服务发送QQ邮件

Yeats_Liao

后端 Java core 10月月更

MTPuTTY配置ssh连接Gitlab

Yeats_Liao

后端 Java core 10月月更

Express 基于 Node.js 平台,快速、开放、极简的 Web 开发框架

小鑫同学

前端 Node 10月月更

上手JavaScript基准测试

小鑫同学

前端 Node 10月月更

开发中遇到跨域我选择这么做

小鑫同学

前端 Node 10月月更

数据导出Excel实战

卢卡多多

Excel 数据导出 10月月更

Visual Studio Code 安装教程附插件推荐

Yeats_Liao

后端 Java core 10月月更

10分钟了解sql注入--报错注入(二)

贤鱼很忙

sql 网络安全 10月月更

35分钟了解sql注入-盲注(三)

贤鱼很忙

sql 网络安全 10月月更

声网高纯:领域和方向要聚焦,用最专业的方法做最专业的事丨人物专访

声网

人工智能 音视频

15分钟了解sql注入(一) union注入

贤鱼很忙

网络安全 Web SQL注入 10月月更

使用PlopJs让开发变得更高效

小鑫同学

前端 Node 10月月更

开箱体验Rust,Come on!!!

小鑫同学

前端 Node 10月月更

算法策略的主动选择,拒绝if...else...(策略模式+简单工厂模式)

小鑫同学

前端 Node 10月月更

[整理]CI持续集成-基于Github Action

小鑫同学

前端 Node 10月月更

Python进阶(十六)正则表达式

No Silver Bullet

Python 正则表达式 10月月更

【玩转云函数】打通Github到企微的消息通知

小鑫同学

前端 Node 10月月更

桌面端开发(Tauri)开启第一篇

小鑫同学

前端 Node 10月月更

jsbridge-n22使用指南

小鑫同学

前端 Node 10月月更

Sass入门使用指南

小鑫同学

前端 Node 10月月更

Flash软件应用项目(二)

张立梵

设计师 Flash 10月月更

活跃开发者数量仅次于以太坊,波卡凭什么?

One Block Community

区块链 开发者 波卡生态

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