Вот пример кода, который показывает, как правильно обрабатывать транзакции:
Transaction tx = session.beginTransaction();
try {
session.save(dropTarget);
tx.commit();
} catch (RuntimeException e) {
if (tx.isActive()) tx.rollback();
throw e;
}
Вы можете создать простую вспомогательную функцию, такую как:
public static <T> T runInTransaction(Session session, Function<Session, T> task) {
Transaction tx = session.beginTransaction();
try {
T res = task(session);
tx.commit();
return res;
} catch (RuntimeException e) {
if (tx.isActive()) tx.rollback();
throw e;
}
}
и использовать ее в своем коде как это:
runInTransaction(session, s -> s.save(dropTarget));