Теперь пришло время задать новый вопрос о JPA.
У меня есть простое приложение, поэтому я хочу создать простой дао-класс для всех моих сущностей.
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);
Но это приводит к исключению NullPointerException относительно "em" в getAll (), поэтому похоже, что он не установлен с @PersistanceContext, как я ожидал.
@ 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, как я ожидал (второй пример кода), и действительно ли это возможно, или мне следует внедрять дао-классы в каждый компонент, где я хочу использовать постоянство?