проектирование спящего дао - PullRequest
3 голосов
/ 07 июля 2011

Я использую следующий код

 TestDAO {

    Session session = null;

    public TestDAO() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

   //...more code create,update ...
  //each method starts a transcation using  "tx= session.beginTransaction();"

}

1) Теперь я должен зафиксировать транзакцию с использованием tx.commit для операции выборки или только для операции сохранения / обновления ??
2) Должен ли я создавать отдельный экземпляр TestDAO каждый раз, когда мне нужно? Или я должен создать одноэлементный класс, который будет возвращать единственный экземпляр DAO каждый? Будет ли это иметь проблему?

Ответы [ 2 ]

3 голосов
/ 07 июля 2011
  1. Вам не нужен tx.commit () для операции выборки. Это необходимо только для сохранения, обновления или удаления. Закройте сеанс после извлечения данных.

  2. Если ваше приложение подключается только к одной базе данных, то лучше использовать один DAO. Весенние рамки поощряют это. Подробнее об этом вы найдете по следующей ссылке

    Не повторяйте DAO!

1 голос
/ 07 июля 2011

Транзакции не должны быть обязанностью DAO, их нужно контролировать на более высоком уровне.DAO должен быть чем-то, что выполняет запросы и обновления, не зная об общей картине, вызовы DAO могут быть сгруппированы в объекте, таком как сервис Spring или EJB-сессионный компонент, который отвечает за решение того, что нужно объединить в транзакции.Это делает ваш код DAO более пригодным для повторного использования, поскольку ему не нужно много знать о контексте, в котором он работает.

Посмотрите, как это делает Spring (в примерах приложений, таких как petstore, которые поставляются с Spring),или, что еще лучше, посмотрите книгу King / Bauer Hibernate-JPA, в которой есть глава о создании DAO.

...