Учитывая, что @PersistenceContext не доступен для внедрения EntityManager, плюс вам нужно вручную управлять транзакциями, каков наилучший способ разработки такого приложения?
Для EntityManagerFactory / EntityManager, насколько я вижу, каждый DAO должен принимать EntityManager в конструкторе, например,
public class DAOImpl implements DAO
{
private EntityManager em;
DAOImpl(EntityManager em){
this.em = em;
}
//all CRUD operations follow
}
Первый вопрос, который возникает, когда вы вызываете EntityManager # close () ?
Точка A: Как я понимаю, вам лучше сделать это в Filter в конце цикла запроса, что означает, что вы связываете EntityManager с текущий поток (используя ThreadLocal?)
Второй вопрос: как и когда вы вводите EntityManager?
Учитывая, что существует ServletContextListener , где мы создаем и закрываем EntityManagerFactory, у нас может быть статический метод следующим образом
public static EntityManager createEntityManager(){
return entityManagerFactory.createEntityManager(PERSISTENT_NAME);
}
но так как мы хотим инкапсулировать создание DAO, мы могли бы использовать фабрику, например
public class DAOFactory
{
public static DAO dao(){
//return a new DAO
}
}
Согласно Точка A мы должны использовать ThreadLocal для создания DAO, используя EntityManager для текущего Thread.
Для управления транзакциями.
Лучший способ, которым я могу придумать (который имитирует спецификацию JPA), - это создать собственную аннотацию транзакции и использовать отражение для внедрения операций начала / фиксации / отката.
Затем вы должны вернуть Proxy из DAOFactory, который обрабатывает транзакции