web-dev-qa-db-ja.com

Hibernate ORM 5の新機能

4番目の候補がHibernate 5でリリースされたのを見ました。以前のバージョンと比較して5の新機能は何ですか?

51

Hibernate 5.xでは、いくつかの刺激的な機能が追加/強化されました。ちょっと見てください。

1. Hibernate Search

Hibernate Searchはオブジェクトに透過的にインデックスを付け、高速で通常のフルテキスト検索と位置情報検索を提供します。使いやすさと簡単なクラスタリングが重要です。

  • エンティティの全文検索-近似による検索(ファジー検索)
  • クラスターフレンドリー-いくつかの簡単なセットアップクラスタリング戦略を提供します
  • ファセットとジオロケーション-ジオローカライズされたエンティティは@Spatialと同じくらい簡単です

Hibernate Searchの詳細については、こちらをご覧ください。

2. Hibernate Validator

Hibernate Validatorには、Eメール、長さ、NotBlankなどの少数の検証ルールが組み込まれています。

注釈ベースの制約を使用して標準化された方法で検証ルールを表現し、さまざまなフレームワークとの透過的な統合の利点を活用します。

Hibernate Validatorの詳細については、こちらをご覧ください。

3.改善されたJava 8サポート

Java 8の日付/時刻データ型(JSR 310)がサポートされており、@ Pastおよび@Futureを介して検証できます。また、ValidatedValueUnwrapperの改善により、オプションおよびJavaFXタイプがサポートされます。

4. Hibernate OGM

最初の安定バージョンをリリースしました。

5.ブートストラップAPI

新しいブートストラップAPI-決定性の向上、統合の向上


他のいくつかのこと:

  • JPA以外の使用法のスキャンサポート
  • NamingStrategyは、より良い設計のAPIを支持して削除されました
  • GenerationType#AUTOとしてマークされたid属性の追加のJavaタイプを処理する機能。NumberおよびUUIDの組み込みサポート。
  • さらに、AttributeConvertersのサポートが拡張され、より完全に実現されました

詳細については、 Hibernate ORM Roadmap を確認してください。

46
Bacteria

Hibernate 5で変更されたものの長いリストがあります。

  1. 新しいbootstrap= APIを使用して、 _persistence.xml_ファイルを必要とせずにプログラムでJPA環境をブートストラップできます

  2. 5.0以降、Hibernate SpatialはHibernateプロジェクトの一部であるため、GISデータも処理できます。

  3. Java 8の日付と時刻のタイプ は、ドメインモデルマッピングでサポートされています。標準のSQL Date/Time型とサポートされているJava 8 Date/Timeクラス型との間のマッピングは次のようになります。

    • 日付:_Java.time.LocalDate_
    • 時間:_Java.time.LocalTime_、_Java.time.OffsetTime_
    • タイムスタンプ:_Java.time.Instant_、_Java.time.LocalDateTime_、_Java.time.OffsetDateTime_および_Java.time.ZonedDateTime_
  4. バイトコード拡張メカニズムはゼロから再設計され、HibernateはMavenとGradleプラグインの両方を備えています。バイトコードインスツルメンテーションで強化できる主な側面は3つあります。

    • 遅延初期化:フィールドはLAZYとして宣言でき、最初にアクセスされたときにのみ取得されます。

    • ダーティチェック:エンティティが強化され、永続コンテキストに読み込まれた後に変更されるすべてのプロパティを追跡できるようになりました。

    • 双方向の関連付け:開発者が片側のみを更新する場合でも、双方向の関連付けの両側を自動的に同期することができます。

  5. HibernateのネイティブAPI(Sessionなど)は、ジェネリック型を使用するように更新されました。エンティティを取得するときにキャストする必要はありません。

  6. Hibernate 5.0は、これをより広範なタイプのセット(たとえば、UUID)に拡張します。

  7. 参照による2次キャッシュ。この機能により、不変のエンティティのエンティティ参照を2次キャッシュに直接保存できます。

  8. Hibernate 5.0以降では、完全に 新しいユーザーガイド がゼロから作成されました。

Hibernate 5.1 は次の機能を追加します。

  1. JPQLおよびHQLクエリで無関係なエンティティを結合できるようになりました
  2. identififerによるマルチエンティティロード

Hibernate 5.2 は以下のサポートを追加します:

  1. Java 1.8、つまり Query.stream()を使用できるようになりました
  2. Hibernate SessionEntityManagerを拡張するため、SessionからすべてのJPAメソッドに直接アクセスできます。
  3. JCacheのサポート
  4. セッションレベルのバッチサイズ
  5. TimestampおよびTimeのグローバルタイムゾーン設定(UTCなど
  6. 個別のパススルーヒント
  7. 定数値のより効率的なJPQLおよびHQL解析
  8. _hibernate.connection.provider_disables_autocommit_リソースローカルトランザクション最適化
  9. Criteria APIリテラルの処理の改善
42
Vlad Mihalcea

Hibernate 5には5つの新機能があります

1。 Basic TypesとしてのDate and Time APIのクラスのサポート新しいDate and Time APIは、Java 8.古いJava.util .Dateには、最終的に修正された多くの問題があります。

残念ながら、JPA 2.1とHibernate 4は直接サポートしていません。しかし、それは大きな問題ではありません。 LocalDateをマッピングするAttributeConverterを実装するには、ほんの数行のコードが必要です。

しかし、明らかに、BasicTypeとしての明示的なサポートの方がはるかに優れています。 Hibernateはバージョン5.0でそれを実装しました。それ以来、Date and Time APIのクラスを永続化するために追加のアノテーションやコンバーターは必要ありません。サポートされている他の属性タイプと同じ方法で使用できます。

2。クエリ結果をストリームとして取得するストリームは大きなものではないように思われるため、クエリ結果を提供する新しいメソッドを導入します。ただし、HibernateのQueryインターフェースのストリームメソッドには、大きな結果セットに対して特に興味深い追加の利点があります。結果セットを複数のバッチで取得し、HibernateのScrollableResults実装を使用してスクロールします。このアプローチは、ストリームを使用して結果セットレコードを1つずつ処理する場合に最適であり、ユースケースを効率的に実装するのに役立ちます。

Hibernate 5.2以降の新しいメソッドを使用して、クエリ結果を取得できます。次のコードスニペットは、データベースからすべてのBookエンティティを選択し、それらをStreamとして処理する簡単な例を示しています。

3。主キーで複数のエンティティを取得します

IDによる複数のエンティティの取得は、非常に一般的な使用例です。ほとんどの開発者は、各プライマリキーに対してEntityManagerのfindメソッドを呼び出すループ、またはIN句のすべてのプライマリキー値をチェックするJPQLクエリを使用して実装します。最初のオプションでは、Hibernateが各主キーに対してデータベースクエリを実行する必要があります。これにより、パフォーマンスに関する大きな問題が発生する可能性があります。 2番目の方法では、1つのクエリですべてのエンティティを取得でき、明らかにより良いオプションです。

Hibernate 5.1は、最初の問題を回避し、2番目のオプションよりも使いやすい3番目のオプションを導入しました。新しいMultiIdentifierLoadAccessインターフェイスは、1つのクエリで複数のエンティティをロードする快適なオプションを提供します。 HibernateセッションでbyMultipleIdsメソッドを呼び出して、MultiIdentifierLoadAccessインターフェイスを取得し、multiLoadメソッドに主キー値のリストを提供するだけです。 Hibernateの実装には、追加の利点もあります。主キー値の巨大なリストを複数のバッチに分割します。一部のデータベースではIN句の要素数が制限されるため、これが必要になることがあります。

4。関連付けられていないエンティティをクエリに参加させる

JPQLクエリでエンティティ間のマッピングされた関連付けを簡単に結合できます。マッピングは既に必要な結合条件を提供しているため、クエリでそれらを提供する必要はありません。

しかし、関連付けられたデータベーステーブルをマップするが、マップされた関連付けがないエンティティはどうでしょうか。

そして、それは修辞的な質問ではありません。

ほとんどのエンティティモデルは、可能なすべての関連付けをマップしません。それらは、ドメインモデルに価値を提供するように見えるもののみをマッピングし、2つのデータベーステーブルが(偶然に)同じ外部キーを格納するものではありません。また、多くの側の多くのレコードとの多対多の関連付けがHibernateにマッピングされないこともよくあります。誰かがアソシエーションのゲッターを呼び出して数百または数千のエンティティをフェッチするリスクは高すぎます。

ドメインモデルを見るだけで十分です。モデルではこれらの関連付けはおそらく必要ありません。しかし、それは、JPQLクエリの1つでそれらが必要ないという意味ではありません。

その場合、次の3つのオプションがあります。

1エンティティ間の関連付けをモデル化するか、
2 JPQLクエリでクロス結合を使用すると、パフォーマンスの問題が発生したり、
3 Hibernate独自のJOIN句を使用します。私はオプション3を好みます。これは最も簡単で自然な方法です。

Hibernate 5.1以降、SQLに似た構文を使用して、モデル化された関連付けなしでエンティティを結合できます。

5。 @Repeatableアノテーション

繰り返し可能な注釈は、Java 8の小さな変更の1つです。これにより、同じ注釈を使用してクラス、属性、またはインターフェースに複数回注釈を付けることができます。エンティティに対して複数の名前付きクエリを定義しています。

これまで、@ NamedQueryアノテーションの配列を含む@NamedQueriesアノテーションでエンティティにアノテーションを付ける必要がありました。それについての厄介なことは、@ NamedQueries注釈が単なるコンテナーであるということです。単独では価値を提供しません。 Hibernate 5.2以降、これを行う必要はありません。少なくともHibernateのバージョンのorg.hibernate.annotations.NamedQueryアノテーションを使用している限りは。 @NamedQueryおよび他の多くのHibernateアノテーションは繰り返し可能になり、複数回割り当てることができます。次のコードスニペットでわかるように、これによりコードが読みやすくなり、使いやすくなります。

Creadit/Sourcehttps://www.thoughts-on-Java.org/5-new-features-hibernate-5- every-developer-know /

2
Vijay Barot