现在是时候向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类?
答案 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/>