写点什么

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

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

关注

评论

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

《恋上数据结构第1季》二叉树代码实现,mongodb持久化原理

Java 程序员 后端

《菜菜的机器学习sklearn课堂》数据预处理和特征工程

Java 程序员 后端

《恋上数据结构第1季》B树,java基础案例教程第二版答案

Java 程序员 后端

「Java」几种典型的内存溢出案例,学习linux的书籍

Java 程序员 后端

【2021软件创新实验室暑假集训】SpringBoot框架

Java 程序员 后端

《码出高效:Java开发手册,java基础编程视频

Java 程序员 后端

【Java 多线程 2】Java线程池详解,java多线程面试算法

Java 程序员 后端

【MyBatis 6】Statement,mysql基础教程西泽pdf

Java 程序员 后端

【Spring Boot 13】实现热部署,最新Java通用流行框架大全

Java 程序员 后端

「一探究竟」迷之序列化,Java性能优化最佳实践

Java 程序员 后端

【Java后端】杭州三面字节,等hr面,虐慌!分享面经和刷过的面试题

Java 程序员 后端

【Java核心面试宝典】Day1,java高级工程师面试宝典

Java 程序员 后端

【Spring Boot 19】Spring Boot整合阿里云OSS实现云存储

Java 程序员 后端

《零基础》MySQL 连接的使用(二十),mybatis实现分页原理

Java 程序员 后端

【Java 强化】单元测试,linux驱动开发入门与实战pdf

Java 程序员 后端

【Java8 新特性 3】Supplier简介,springboot面试题

Java 程序员 后端

【Java程序员必知必会的90个细节】1,java面试题选择题

Java 程序员 后端

【Spring Boot 8】Okhttp实现GitHub第三方登录

Java 程序员 后端

【Spring Boot 12】看完这篇,nginxkeepalived原理

Java 程序员 后端

《JVM系列》 第六章 -- 对象的实例化与内存布局

Java 程序员 后端

《Spring实战》读书笔记-第2章 装配Bean,kafka调优面试

Java 程序员 后端

《零基础》MySQL 管理(三),java程序设计精编教程第三版课后答案

Java 程序员 后端

【Effective Java】10,javaee架构设计与开发实践

Java 程序员 后端

【Java基础】枚举,nginx源码分析pdf百度网盘

Java 程序员 后端

【Java笔记】数组的处理方法,idea搭建springboot入门

Java 程序员 后端

《深入理解Java虚拟机 1》Java内存区域与内存分配策略

Java 程序员 后端

《深入理解Java虚拟机 3》类加载机制与字节码执行引擎

Java 程序员 后端

《重构 改善既有代码的设计 3》代码的可理解性应该是我们虔诚追求的目标

Java 程序员 后端

《黑马程序员》通讯录管理系统实战,java程序设计实用教程第二版课后题答案

Java 程序员 后端

【Docker 系列】我们来看看容器数据卷到底是个啥

Java 程序员 后端

【SpringMVC笔记】Ajax 入门,springboot源码解读与原理分析

Java 程序员 后端

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