2011-09-16 152 views
1

現在是時候對JPA提出問題了。@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如我所料(第二代碼示例),這是否真的有可能或者我應該在每個bean中注入dao類,我想使用持久性?

回答

5

注入到EntityManagerGenericDAO沒有工作,因爲GenericDAO不管理。相反,如果這個類是一個會話bean或一個託管bean,那麼注入就會起作用。

,除了,其他幾個點要注意

  • 創建EntityManager不是一個昂貴的操作。所以當你想操作實體時,你可以在所需的類上注入EntityManager,並直接使用EntityManager上的方法。 (旁註:EM避免注入servlet)
  • GenericDAO似乎並不能提供很多。 EntityManager已經足夠通用,你可以直接使用它。
  • 最後,關於使用static變量和方法的警告。爲了可測試性和線程安全性,我建議不要這樣做。

使用@Stateless豆與EntityManager作爲DAO注入是一種常見的做法。總而言之,您可以簡單地將EM注入任何需要進行實體操作而無需使用DAO的類中。如果您希望爲關注點分離,你可以有一個Stateless豆與EM注入的DAO如果啓用了 PersistenceAnnotationBeanPostProcessor

0

Spring能夠識別字段或者方法級別@PersistenceContext註解。

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

作爲替代定義PersistenceAnnotationBeanPostProcessor明確, 考慮使用Spring上下文:註解配置XML元素在你的應用程序上下文 配置。

<!-- post-processors for all standard config annotations --> 
<context:annotation-config/>