Как откатить две транзакции в спящем режиме? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть два метода:

public void removeObject(CustomObject o){
    Transaction tx = null;
    try (Session session = HibernateUtil.getSessionFactory().openSession()) {
        tx = session.beginTransaction();
        session.delete(o);
        tx.commit();
    } catch (HibernateException e) {
        if (tx != null) tx.rollback();
        throw new HibernateException(e.getMessage());
    }
}

и

public void createF(F f){
    Transaction tx = null;
    try (Session session = HibernateUtil.getSessionFactory().openSession()) {
        tx = session.beginTransaction();
        session.save(f);
        tx.commit();
    } catch (HibernateException e) {
        if (tx != null) tx.rollback();
        throw new HibernateException(e.getMessage());
    }
}

Если что-то пойдет не так в любом из них, он получит откат.

Однако,Что делать, если я хочу, чтобы моя бизнес-логика:

  1. Удалить строку CustomObject из таблицы CustomObject
  2. Добавить строку в таблицу F

Я мог бы сделать что-то вроде:

try{
    dbDAO.removeObject(o);
    // some logic
    dbDAO.createF(f)
}catch(Exception e ) {...}

Однако, если ошибка возникает в функции createF(), removeObject() уже удалил объект в БД, и с реализацией он уже зафиксировал изменения, поэтому при сбое createF() и откате он не будет откатываться.меняется от removeObject().

Как справиться с подобной ситуацией?Нужно ли создавать другую функцию, например:

public void removeAndCreate(F f,CustomObject o){
    Transaction tx = null;
    try (Session session = HibernateUtil.getSessionFactory().openSession()) {
        tx = session.beginTransaction();
        session.delete(o);
        // some locis 
        session.save(f);
        tx.commit();
    } catch (HibernateException e) {
        if (tx != null) tx.rollback();
        throw new HibernateException(e.getMessage());
    }
}

Другими словами, я не могу использовать эти два метода повторно, или есть какой-либо метод, который позволил бы мне повторно использовать методы в подобных ситуациях?

Я могу представить себе много логики, требующей комбинации более чем одного метода DAO, поэтому создание другого метода для комбинаций для операций N будет большой работой.

Спасибо за помощь!Я использую Hibernate 5 и весной

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