Я использую guice-persist вместе с JPA и Hibernate ORM.В ServiceLayer
я использую @Transactional
для одной из функций, в которых я вызываю несколько разных DAO.
ServiceLayer.java
...
@Transactional
public List<DetailedInfo> getDetailedInfo() {
dao1.getDetailedInfo();
dao2.getDetailedInfo();
...
DAO1.java
...
private Provider<EntityManager> emprovider;
@Getter
private final Class<T> entityClass;
@Inject
protected DAO1(Provider<EntityManager> emprovider) {
this.entityManagerProvider = entityManagerProvider;
this.entityClass = EntityClass1.class;
}
EntityManager getEntityManager() {
return entityManagerProvider.get();
}
public List<T> getAll() {
final EntityManager em = getEntityManager();
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<T> criteriaQuery = cb.createQuery(entityClass);
final Root<T> root = criteriaQuery.from(entityClass);
criteriaQuery.select(root);
return em.createQuery(criteriaQuery).getResultList();
}
Другие определения DAO аналогичны.
Здесь я не закрываюсь entitymanager
в любом месте в DAO.Функция DAO вызывается из функции ServiceLayer
с аннотацией @Transactional
.Насколько я понимаю, JpaLocalTxnInterceptor
несет ответственность за закрытие всех EntityManager
в области действия @Transactional
.
Будет ли оно также освобождать соединение с БД после транзакции?