2012-10-07 11 views
10

JPA(JPAプロバイダとしてのHibernate)を使用しています。私は本当に冬眠の詳細を避け、JPA仕様を使用しようとしています。私は遅延オブジェクトを初期化する関数を持っています。残念ながら、Hibernate固有の関数を使用します。これは私の関数です:遅延エンティティを初期化する標準JPAメソッド

private T initializeAndUnproxy(T entity) { 
     if (entity == null) { 
      throw new 
       NullPointerException("Entity passed for initialization is null"); 
     } 

     Hibernate.initialize(entity); 
     if (entity instanceof HibernateProxy) { 
      entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer().getImplementation(); 
     } 
     return entity; 
    } 

実体を初期化する純粋なJPA方法はありますか?

答えて

7

エンティティを初期化する標準的な方法はないようです。

あり、標準的なエンティティが初期化されているかどうかを確認する方法(完全にロードされた)か否かであり、それはPersistenceUnitUtil経由だ(もHow to test whether lazy loaded JPA collection is initialized?を参照してください)

は限り実体がまだ装着されているとして、あなたがそのプロパティにアクセスすることができます強制初期化。これは非常にきれいではありませんが、いくつかの拡張に動作します。欠点は、プロパティの正確な性質(たとえば要素数の多いコレクション)によっては、データベースに対して数十から数百、さらには数千ものクエリを実行する可能性があるということです。

多くの場合、(未知の)エンティティをプログラムで強制的に初期化するのではなく、初期化する必要があるものを事前に指定する方がよいでしょう。私はこれについての記事を書いたhere

しかし、標準的なフレームワークメソッドを1回呼び出すだけでエンティティを完全に初期化する必要がある場合は、残念ながら方法がないようで、今のところHibernate固有のコードに固執する必要があります。

+2

最後の文について:私はそれを使用しませんでしたが、Entitygraphsを使用して完全なエンティティを取得する方法については、こちらをご覧ください(https://docs.oracle.com/javaee/7/api/javax/persistence/EntityGraph.html)。エンティティのエンティティグラフをフェッチし、そのメタモデルのすべての遅延プロパティをAttributeNodesとして追加してからフェッチすることはできないでしょうか? –

関連する問題