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()
メソッドがQuery
とTypedQuery
インタフェース両方に追加された。この改善で結果のストリームを返すようになり、データを扱う便利な方法が提供されている。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
- Editor Review
- Chief Editor Action