Это плохой дизайн для DAO для управления транзакциями? - PullRequest
8 голосов
/ 24 июня 2010

Я читал о реализации Sun blueprint GenericDAO и о том, как Гэвин Кинг использует его в Hibernate. Кажется, он ничего не упоминает об обработке транзакций:

public abstract class GenericHibernateDAO<T, ID extends Serializable> {
    protected Session getSession() {
        return HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public T makePersistent(T entity) {
        getSession().saveOrUpdate(entity);
        return entity;
    }
}

Я озадачен тем, куда мне положить начало / конец транзакции. В настоящее время они находятся в DAO, которые расширяют этот GenericHibernateDAO

public class FooHibernateDAO extends GenericHibernateDAO<Foo, Long> {
    public Foo saveFoo(Foo foo) {
        getSession().beginTransaction();
        makePersistent(foo);
        getSession().getTransaction().commit();
    }
}

Должен ли обработчик транзакций управляться вызывающей стороной DAO на уровне приложения?

Ответы [ 2 ]

16 голосов
/ 24 июня 2010

Обычно рекомендуется управлять транзакциями на уровне обслуживания, а не на уровне DAO.Каждый метод DAO обычно обрабатывает одну конкретную операцию, а метод службы объединяет их в одну транзакцию.

3 голосов
/ 24 июня 2010

Транзакции должны управляться на уровне приложения. Скажем, например, у вас был аккаунт DAO:

public class AccountDAO {
   public void DebitAccount( int accountId, int dollars ) {

   }

   public void CreditAccount( int accountId, int dollars ) {
   }
}

Если бы я хотел перевести деньги между счетами, я бы позвонил DebitAccount на один счет и CreditAccount на другой. Я хотел бы, чтобы эти вызовы происходили в одной транзакции. DAO не может этого знать, но уровень приложений будет.

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

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