правильно реализовать класс dao для управления транзакциями - PullRequest
2 голосов
/ 21 июля 2011

Я работаю над веб-приложением java, которое вызывает базу данных через hibernate. Я использую сервлеты, jsp и tomcat для тестирования / развертывания. В большинстве книг по java-ee предлагается использовать классы Dao для вызовов базы данных. Согласно примерам, приведенным в книгах ( Hibernate Recipes by Gary Mak ), я создал общий базовый класс и специальный подкласс, как показано ниже.

class BaseDao{
   private Class persistentClass;
   public BaseDao(Class persistentClass) {
        super();
        this.persistentClass = persistentClass;
    }
   public Object findById(Long id) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Object object = null;
        try {
            object = (Object) session.get(persistentClass, id);
            return object;
        }
        finally {
            session.close();
        }
    }

    @Override
    public void saveOrUpdate(Object obj) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Transaction tx = null;
        try {
        tx = session.beginTransaction();
        session.saveOrUpdate(obj);          
        tx.commit();
        }catch(HibernateException e){
            if (tx != null) {
                       tx.rollback();   

             }
             throw e;
        }finally {
            session.close();
        }

    }
}

    class SaleOrderDao extends BaseDao{
        public SaleOrderDao() {
            super(SaleOrder.class);
        }
        @Override
       public SaleOrder findSaleOrderById(Long saleOrderId){            
                SaleOrder so =  (SaleOrder)findById(saleOrderId);
                return  so;

        }
        @Override
        public void saveOrUpdateSaleOrder(SaleOrder so){

                    saveOrUpdate( so);

            }

    }

Просматривая посты на этом форуме, я натолкнулся * * * * * * * * * * * * * * * * * * Райан Стюарт * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. использовать любую веб-инфраструктуру, которая поддерживает управление транзакциями ... и я ограничен использованием jsp, сервлетов и контейнера сервлетов.

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

Надеюсь, кто-нибудь поможет мне с предложениями

искренне,

Jim

1 Ответ

9 голосов
/ 21 июля 2011

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

Spring (как и другие структуры DI) позволяет вам сделать это, просто аннотируя методы обслуживания с помощью @Transactional.Без весны вы все еще можете сделать это вручную в сервисном слое

...