Как @Transactional работает в реальном времени с JPA 2.0? - PullRequest
0 голосов
/ 03 января 2019

Я использую 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.

Будет ли оно также освобождать соединение с БД после транзакции?

...