2016-03-03 2 views
0

У меня 2 модели классов: Modela & ModelBРаботает ли переключение транзакций Hibernate?

2 настойчивые классы: ModelADAO & ModelBDAO. В каждой реализации для него я использовал откат транзакций для метода save (model). В основном следующим образом:

public class ModelADAOImpl implements ModelADAO { 

    public bool save(modelA) { 

     try { 
      session = this.sessionFactory.openSession(); 
      transaction = session.beginTransaction(); 
      ... 

      session.persist(modelA); 

      ... 
      transaction.commit(); 

     } catch(Exception e) { 
      transaction.rollback(); 

     } finally { 
      session.close(); 
     } 
    } 

} 

public class ModelBDAOImpl implements ModelBDAO { 

    public bool save(modelB) { 

     try { 
      session = this.sessionFactory.openSession(); 
      transaction = session.beginTransaction(); 
      ... 

      session.persist(modelB); 

      ... 
      transaction.commit(); 

     } catch(Exception e) { 
      transaction.rollback(); 

     } finally { 
      session.close(); 
     } 
    } 

} 

Теперь у меня есть другой класс с SaveAll (Modela, modelB) метод для сохранения информации для обоих Modela и modelB по телефону modelADAO.save (Modela) и модельBDAO.save (модельB).

public class WrapperDAOImpl implements WrapperDAO { 

    @Autowired 
    private ModelADAO modelADAO; 

    @Autowired 
    private ModelBDAO modelBDAO; 

    public bool saveAll(modelA, modelB) { 

     try { 
      ... 

      modelADAO.save(modelA); 
      modelBDAO.save(modelB); 

      ... 

     } catch(Exception e) { 
      ... 

     } finally { 
      ... 
     } 
    } 

} 

Как я могу применить откат для saveAll (modelA, modelB) в этом случае? Потому что я открывал и закрывал сессию в каждом методе save().

Спасибо!

Trong.

ответ

0

Типичным решением, которое применяется большинством фреймворков, является отслеживание выполняемой транзакции потоком, поэтому вы сохраняете поток-локальный с текущей транзакцией. Другим решением было бы передать tx в качестве аргумента для ваших методов.

1

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

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

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

Другим вариантом, чтобы оставить управление транзакциями внутри DAO, может быть использование транзакции, с PROPAGATION=required. Однако я никогда не использовал его и не знал, как это работает, но, по крайней мере, теоретически предполагается, что таким образом, если нет транзакции, созданной при вызове метода save, она будет создана, но если есть уже созданная транзакция он будет использовать его. Откат отменяет все изменения.

+0

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

0

Ваш обязательный универсальный интерфейс для сохранения ваших данных не зависит от объекта entityA или entityB. Кроме того, для ваших моделей у вас должен быть базовый компонент, в котором содержится идентификатор.

public class BaseBean{ 

private Long id ; 
//get + set 

} 

public class Aa extends BaseBean{ 

} 

public class Bb extends BaseBean{ 

} 

public interface daoRepository{ 
<T extends BaseBean> void save(Iterable<? extends T> objects); 
} 


public class daoImpl implements daoRepository{ 

    @Override 
    public <T extends BaseBean> void save(Iterable<? extends T> objects){ 
     try { 
     session = this.sessionFactory.openSession(); 
     transaction = session.beginTransaction(); 
     ... 
     for (T t : objects) { 
     session.persist(t); 
     } 
     ... 
     transaction.commit(); 

    } catch(Exception e) { 
     transaction.rollback(); 

    } finally { 
     session.close(); 
    } 
    } 
} 
+0

Я понимаю, что вы сказали, но я не хочу реорганизовывать их, потому что система работает с этими методами. –