2

JPA に関する 1 つの質問があります: JPA 2.0 の API を使用して (Hibernate から) DetachedCriteria をシミュレートする方法はありますか?

そして、これを達成するためにどのクラスを拡張する必要があるか?

私は hibernate 3.6.5 と hibernate-jpa-2.0-api-1.0.0.Final を使用しています。

4

1 に答える 1

3

Hibernate では、Hibernate Session の外部で DetachedCriteria オブジェクトを作成し、それを後の Session にアタッチして実行します。

要約すると、EJB スタイルの JPA EntityManager (コンテナー管理の PersistenceContext を使用) は、Hibernate DetachedCriteria と同様に自動的に動作する Query オブジェクトを作成できますが、「コア Java」スタイルの EntityManager (つまり、アプリケーション管理) は、Hibernate DetachedCriteria と同様に動作するクエリを作成できません。 .

JPA の PersistenceContext は Hibernate Session に相当します。
JPA の Query は DetachedCriteria に相当します。
JPA EntityManager には、いつでも PersistenceContext が存在する場合と存在しない場合があります。EntityManager には次の 3 つのタイプがあります。

  1. トランザクション コンテキスト EM - このタイプの EM は、SessionBean EJB (@Stateless または @Stateful) 内でのみ作成できます。PC は完全にコンテナ管理されています。トランザクションが実行されていない場合、PC は存在しません。トランザクションが開始され、永続化操作が発生すると、PC が自動的に作成され、接続され、トランザクションと共に伝播されます。各 EM 操作は、トランザクションのプライベート データ内で PC を検索します。トランザクションが終了すると、PC は自動的にクリアされ、削除されます。
  2. 拡張コンテキスト EM - このタイプの EM も、SessionBean EJB 内でのみ作成できますが、@Stateful のみです。PC も完全にコンテナ管理されています。PC は、Bean がセッション会話を開始するときに作成されます (Bean への参照で呼び出される最初のメソッド)。PC はステートフル セッション Bean のプライベート データにアタッチされます。セッション会話の最後のメソッドが完了すると、PC はクリアされて削除されます (つまり、@Remove でマークされたメソッドが呼び出されます)。
  3. Application Managed EM - このタイプの EM は、任意のタイプの EJB またはクラスパスに JPA クラスを持つ任意の Java POJO など、どこにでも作成できます。EM が作成されると PC が作成され、EM が閉じられると PC はクリアされて削除されます。

(1) と (2) の場合、EntityManager は (em.createQuery() メソッドを介して) いつでもクエリを作成できます。その後、PC が存在する場合、クエリを実行できます。これは、Hibernate と同じ動作です。ケース (3) では、Hibernate DetachedCriteria に相当するものはありません。

ここで EJB について言及したという事実を恐れないでください。それらは実装が簡単で、基本的にはPOJOよりも「大きく、速く、強力」にするために、いくつかの追加の注釈が追加され、いくつかのApp Server機能が目に見えないように追加された単なるPOJOです。

(2) の例:

@Stateful   
class MyStatelessEJB {    
   // Entity Manager is automatically created and injected     
   // persistent unit name is in persistence.xml
   @PersistenceContext(unitName="myPersistenceUnitName",type=PersistenceContextType.EXTENDED)   
   EntityManager em;    
   Query q1 = null;    
   Query q2 = null;

   @NOT_SUPPORTED                                     // no transaction or PC here 
   public methodA() {....                               
                      q1 = em.createQuery(...);       // create query anyway
                      q2 = em.createTypedQuery(...);
                      ...}  

   public methodB() {....  q.execute();  ...}    // transaction & PC here - just use Query

   @Remove   
   // when this method is completes the EJB Session ends    
   public methodC() {....  List<Foo> fooList = q.execute().getResultList; ...} 

}

(1) (トランザクション スコープの PC を持つステートレス セッション Bean) の例は似ていますが、ステートレスであるためインスタンス変数はありません。EntityManager と Query は、各メソッド内でローカル変数として作成および格納するか、格納できる別のステートフル EJB に渡す/転送する必要があります。

于 2012-11-02T10:17:46.100 に答える