Какова подходящая структура DAO с jpa2/eclipselink?

У меня есть объекты JPA, и мне нужно выполнять с ними логику. До сих пор эту работу выполнял огромный класс статической базы данных. Это уродливо, потому что каждый метод общедоступного интерфейса имел частный эквивалент, который использовал EntityManager для выполнения транзакций. Но я мог бы решить и это, имея статический em! Однако мне интересно, является ли это подходящим дизайном, тем более что класс отвечает за многие вещи. Неудивительно, что код, который я нашел в Интернете для реальных проектов, было нелегко понять (я мог бы также остаться со своим кодом). Код здесь легко понять, хотя, может быть, слишком обобщенно? Во всяком случае, поверх JDBC. Тем не менее, проницательно, зачем использовать фабрики и синглтоны для DAO?

Я думал об однотонном экземпляре em следующим образом:

private static final Map<String, EntityManager> ems = new HashMap<String, EntityManager>();
private final EntityManager em;
private final EntityManagerFactory emf;

public void beginTransaction() {
    em.getTransaction().begin();
}

public void commitTransaction() {
    em.getTransaction().commit();
}

public Database(final String persistenceUnitName) {
    if(ems.containsKey(persistenceUnitName)){
        em = ems.get(persistenceUnitName);
    }else{
       ems.put(persistenceUnitName, em = Persistence.createEntityManagerFactory(persistenceUnitName).createEntityManager());
    }
    emf = em.getEntityManagerFactory();
    this.persistenceUnitName = persistenceUnitName;
}

Таким образом, создание экземпляров является стандартным, но при этом сохраняется singleton Connection/EntityManager. С другой стороны, я задавался вопросом, была ли вообще необходимость в одноэлементных ems? Преимущество заключается в том, что с несколькими ems у меня возникают проблемы с блокировкой (без использования em.lock()).

Любая обратная связь? Любой реальный или учебный код, который демонстрирует DAO с JPA2 и eclipselink?


person simpatico    schedule 15.09.2010    source источник


Ответы (2)


Лично я не вижу дополнительных преимуществ в защите EntityManager (который является реализацией домена Store) с DAO, и я бы использовал его непосредственно из сервисы, если только переход с JPA не является вероятным событием. Но, цитируя интересный спор о JPA и DAO:

Адам сказал, что он встречал очень мало случаев, когда проект менял поставщика базы данных, и ни одного случая, когда персистентность перемещалась на что-то другое, кроме RDBM. Почему вы должны платить больше за то, что вряд ли произойдет? Иногда, когда это происходит, более простое решение может окупиться, и может оказаться проще переписать компонент.

Я полностью разделяю изложенную выше точку зрения.

В любом случае, остается открытым вопрос о жизненном цикле EntityManager, и ответ на него сильно зависит от характера вашего приложения (веб-приложение, настольное приложение).

Вот несколько ссылок, которые могут помочь решить, что будет уместно в вашем случае:

И если вы действительно хотите пойти по пути DAO, вы можете:

person Pascal Thivent    schedule 17.09.2010

Вы можете рассмотреть возможность использования Spring 3. Просто следуйте их документацию для чистого дизайна.

person Damien    schedule 15.09.2010