Какова подходящая структура DAO с jpa2 / eclipselink? - PullRequest
4 голосов
/ 15 сентября 2010

У меня есть 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?

Ответы [ 2 ]

3 голосов
/ 17 сентября 2010

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

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

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

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

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

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

1 голос
/ 15 сентября 2010

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

...