2011-09-16 14 views
1

JPAについての質問はnoobにお願いします。@PersistenceContextと静的プロパティ

私は単純なアプリケーションを持っているので、すべてのエンティティのための簡単なDAOクラスを作りたいと思っています。

import java.io.Serializable; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import org.hibernate.Session; 

public class GenericDAO implements Serializable { 

public GenericDAO() { 
} 

@PersistenceContext(unitName="TestAppPU") 
public static EntityManager em; 

public static <T> void save(T smth) { 
    em.persist(smth); 
} 
public static <T> void merge(T smth) { 
    em.merge(smth); 
} 
public static <T> void remove(T smth) { 
    em.remove(smth); 
    em.flush(); 
} 

public static <T> List<T> getAll(Class<T> cls) { 
    return (List<T>) ((Session) em.getDelegate()).createCriteria(cls).list(); 
} 
} 

は、私はそのようにそれを使用しようとしました:

testEntitys =GenericDAO.getAll(TestEntity.class); 

をしかし、それはのgetAll()で「EM」についてNullPointerExceptionで押しつぶし、それは私として@PersistanceContextに設定されていないように見えます期待される。

私は、マネージドBeanでそれを使用するときに正常に動作します@PersistanceContext:

@ManagedBean 
@SessionScoped 
public class TestBean { 


    @PersistenceContext(unitName="TestAppPU") 
    public EntityManager em; 

...  
testEntitys = em.createQuery("select t from TestEntity t").getResultList(); 
... 

persistance.xmlが右のように構成されているようなので、それが見えます。しかし、私はGenericDAOにそれらを渡したくない。

私の期待するところは、@PersistanceContextでGenericDAOを動作させる方法です(2番目のコードサンプル)。これは本当に可能ですか、永続性を使用するすべてのBeanにDAOクラスを注入する必要がありますか?

答えて

5

GenericDAOは管理されていないため、GenericDAOにはEntityManagerに、GenericDAOには注入されませんでした。代わりに、クラスがセッションBeanまたはマネージドBeanの場合、インジェクションは機能していました。離れて、いくつかの他の点はEntityManager作成

  • 注意する

    は高価な操作ではありません。エンティティを操作する場合は、EntityManagerを必要なクラスに挿入し、EntityManagerのメソッドを直接使用します。 (傍点:EMサーブレットへの注入は避けてください)

  • このGenericDAOはあまり提供していないようです。 EntityManagerは既に十分に一般的で、直接使用することができます。
  • 最後に、static変数とメソッドの使用に関する警告。私は、テスト容易性と糸の安全性のために、それに反対することを勧めます。

@Statelessを使用して、EntityManagerをDAOとして注入することが一般的な習慣の1つです。

要約すると、EMは、DAOを使用せずにエンティティ操作を行う必要がある任意のクラスに簡単に挿入できます。あなたが関心事の分離を望んだ場合、あなたは をPersistenceAnnotationBeanPostProcessorが有効になっている場合

0

春は、フィールドやメソッドレベルの両方で@PersistenceContext注釈を理解することができますDAOとして注入EMStateless Beanを持つことができます。明示的をPersistenceAnnotationBeanPostProcessorを定義することの代替として

<!-- bean post-processor for JPA annotations --> 
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 

、 は、Springコンテキストを使用することを検討してください:あなたのアプリケーションコンテキスト 構成でアノテーション設定XML要素を。

<!-- post-processors for all standard config annotations --> 
<context:annotation-config/> 
関連する問題