JPA に関する 1 つの質問があります: JPA 2.0 の API を使用して (Hibernate から) DetachedCriteria をシミュレートする方法はありますか?
そして、これを達成するためにどのクラスを拡張する必要があるか?
私は hibernate 3.6.5 と hibernate-jpa-2.0-api-1.0.0.Final を使用しています。
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) と (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 に渡す/転送する必要があります。