Как проектировать для JPA на веб-сервере, отличном от Java EE (например, Tomcat) - PullRequest
1 голос
/ 25 июня 2009

Учитывая, что @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, который обрабатывает транзакции

1 Ответ

3 голосов
/ 25 июня 2009

Я бы не стал все это делать. Зачем пытаться воссоздать всю спецификацию JPA самостоятельно? Вам просто нужно иметь возможность использовать JPA без контейнера.

Весна может помочь вам в этом. Попробуй.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...