@PersistenceContext和静态属性

时间:2011-09-16 18:52:22

标签: java-ee jpa glassfish

现在是时候向NOA询问有关JPA的问题了。

我有一个简单的应用程序,所以想为我的所有实体制作一个简单的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()中使用NullPointerException来破坏“em”,所以看起来它没有像我预期的那样使用@PersistanceContext设置。

@PersistanceContext在托管bean中使用时工作正常:

@ManagedBean
@SessionScoped
public class TestBean {


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

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

所以看起来persistance.xml配置正确。但我不想将em传递给GenericDAO。

所以我的问题是如何按照我的预期(第二个代码示例)实现@PersistanceContext工作GenericDAO并且确实可行,或者我应该在每个我想使用持久性的bean中注入dao类?

2 个答案:

答案 0 :(得分:5)

EntityManager注入GenericDAO无效,因为GenericDAO未受管理。相反,如果该类是会话bean或托管bean,那么注入就可以了。

除此之外,还有其他几点要注意

  • 创建EntityManager并不是一项代价高昂的操作。因此,当您想要对实体进行操作时,您可以在所需的类上注入EntityManager并直接使用EntityManager上的方法。 (旁注:EM应避免注入servlet)
  • GenericDAO似乎没什么用。 EntityManager已足够通用,您可以直接使用它。
  • 最后,警告使用static变量和方法。为了可测试性和线程安全性,我建议反对它。

使用注入@Stateless作为DAO的EntityManager bean是一种常见做法。

总而言之,您可以简单地在任何需要执行实体操作的类中注入EM,甚至不使用DAO。如果您希望分离关注点,可以将Stateless bean注入为EM作为DAO

答案 1 :(得分:0)

如果a,Spring可以在字段和方法级别理解@PersistenceContext注释 PersistenceAnnotationBeanPostProcessor已启用。

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

作为显式定义PersistenceAnnotationBeanPostProcessor的替代方法, 考虑在应用程序上下文中使用Spring上下文:annotation-config XML元素 配置。

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