Это то, что вы ищете?
@FunctionalInterface
public interface TransactionRunnable {
void runTransactionCode(EntityManager em);
}
public void runInNewTransaction(TransactionRunnable code) {
try(Transaction tx = persistence.createTransaction()){
code.runTransactionCode(persistence.getEntityManager());
tx.commit();
}
}
public void foo(Object bar, EntityManager em) { /*...*/ }
public void baz(String str, EntityManager em) { /*...*/ }
Foo может быть вызван внутри собственной транзакции, используя
runInNewTransaction((em) -> foo(myBar, em));
... и аналогично ...
runInNewTransaction((em) -> baz("hello", em));
Очевидно, что интерфейс TransactionRunnable
можно изменить, поэтому его метод объявляет исключение, если это необходимо.