У меня есть два метода:
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());
}
}
Если что-то пойдет не так в любом из них, он получит откат.
Однако,Что делать, если я хочу, чтобы моя бизнес-логика:
- Удалить строку CustomObject из таблицы CustomObject
- Добавить строку в таблицу 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 и весной