[关闭]
@Rays 2018-01-14T20:19:26.000000Z 字数 2722 阅读 1784

JPA 2.2改进了易用性

语言开发 Java


摘要: Oracle发布了JPA(Java Persistence API)规范2.2版. 该版本进一步完善了Java EE 8,使开发人员可以使用Java 8提供的更多特性。

作者: Kesha Williams

正文:

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之前,查询只能返回一个列表。使用新的流方法的示例代码如下:

  1. Stream<Stock> stocks = entityManager
  2. .createNamedQuery(Stock.FIND_HIGH_PERFORMERS, Stock.class)
  3. .getResultStream();
  4. stocks.filter(...)

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

可注入的AttributeConverter

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

  1. @Converter(autoApply = true)
  2. public class TheAttributeConverter implements AttributeConverter<TheObject, String> {
  3. @Inject
  4. private MyUtils utils;
  5. @Override
  6. public TheObject convertToEntityAttribute(String s) {
  7. return utils.toTheObject(s);
  8. }
  9. @Override
  10. public String convertToDatabaseColumn(TheObject obj) {
  11. return utils.toString(obj);
  12. }
  13. }

可重复注解

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

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

  1. @Entity
  2. @NamedQuery(name = "Stock.findBySymbol", query = "SELECT s FROM Stocks s WHERE s.symbol = :symbol")
  3. @NamedQuery(name = "Stock.findByDate", query = "SELECT s FROM Stocks s WHERE s.date = :date")
  4. @NamedQuery(name = "Stock.findByPrice", query = "SELECT s FROM Stocks s WHERE s.price = :price")
  5. public class Stock {
  6. ...
  7. }

支持Java 8的日期/时间

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

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

  1. @Entity
  2. public class Stock implements Serializable {
  3. @Id
  4. @GeneratedValue(strategy = GenerationType.AUTO)
  5. @Column(name = "ID", updatable = false, nullable = false)
  6. private Long id;
  7. @Column(name="LAST_BUY_DATE")
  8. private LocalDate lastBuyDate;
  9. @Column(name="LAST_BUY_TIME")
  10. private LocalDateTime lastBuyTime;
  11. }

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

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

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注