BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JPA 2.2での便利な改善

JPA 2.2での便利な改善

ブックマーク

原文(投稿日:2018/01/13)へのリンク

A note to our readers: As per your request we have developed a set of features that allow you to reduce the noise, while not losing sight of anything that is important. Get email and web notifications by choosing the topics you are interested in.

オラクルはJava Persistence API(JPA)のバージョン2.2をリリースした。Javaオブジェクトをリレーショナルデータベースに永続化するための標準である。

Java EE 8プラットフォームの一部として、JPA 2.2はストリームとしてクエリ結果を受け取ることのサポートやマネージドビーンの属性コンバータへのインジェクト、繰り返し可能なアノテーション、Java 8 Date and Time APIのクラスとの連携を含む。変更は少ないが、JPA 2.2はJava EE 8を基準とする最初のバージョンであるため重要である。

Josh Juneau氏は、記事"JPA 2.2の最新情報"(Java Magazine 2017年11月12月号)で以下のように述べている。

ついにJPAがJava SE 8と連携します。これで開発者はDate and Time APIやストリームとしてクエリ結果を受け取ること、繰り返し可能なアノテーションといったものを利用できます。


ストリームとしてクエリ結果を受け取る

getResultStream()メソッドがQueryTypedQueryインタフェース両方に追加された。この改善で結果のストリームを返すようになり、データを扱う便利な方法が提供されている。JPA 2.2以前はクエリから返せるのはリストだけだった。新しいストリームメソッドは次のように使える。

Stream<Stock> stocks = entityManager  
      .createNamedQuery(Stock.FIND_HIGH_PERFORMERS, Stock.class)  
      .getResultStream();

stocks.filter(...)

ストリームはクエリのパフォーマンスをよくするのに役立つ。しかし大きなデータセットを扱う際にはResultSetのページネーションがパフォーマンスをよくするというケースもある。getResultStream()のよりよい実装を提供することでこの余分な負荷を考慮に入れている永続性プロバイダがいくつかある。開発者は大きなデータセットでストリームを使う際にパフォーマンスを考慮すべきである。

インジェクト可能な属性コンバータ

JPA 2.2ではContexts and Dependency Injection(CDI)の@Injectアノテーションを使ってマネージドビーンを属性コンバータにインジェクトできるようにした。この機能を活用するには、必要に応じてCDIリソースを任意の属性コンバータにインジェクトする。

@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);
    }
}

繰り返し可能なアノテーション

コンテナアノテーションに対応するアノテーションはすべて繰り返し可能となった。クラスやメソッド、属性に同じアノテーションを複数付与できる。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の以前のバージョンと異なり、データベースの日時の型をJava 8の日時の型にマッピングする(逆も然り)属性コンバータを書く必要はもはやない。JavaのDate and Time APIをビルトインでサポートするので、サポートする5つの型を使うのなら追加の作業は必要なく、それらを既存の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バージョンでもプロジェクトに適切なJARファイルを単に含めるだけでそれらにアクセスできるようになる。

より詳細はJava Persistence 2.2メンテナンスリリースのリリースノートにある。

 

 
 

Rate this Article

Adoption Stage
Style
 
 

この記事に星をつける

おすすめ度
スタイル

BT