package book.example.persistence.tests; import javax.persistence.EntityManager; import javax.persistence.EntityTransaction; import javax.persistence.PersistenceException; public class JPATransactor { private final EntityManager entityManager; public JPATransactor(EntityManager entityManager) { this.entityManager = entityManager; } public void perform(UnitOfWork unitOfWork) throws Exception { final EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); try { unitOfWork.work(); transaction.commit(); } catch (PersistenceException e) { throw e; } catch (Exception e) { transaction.rollback(); throw e; } } public <T> T performQuery(QueryUnitOfWork<T> query) throws Exception { perform(query); return query.result; } }