我与JPA和Hibernate ORM一起使用guice-persist。
在ServiceLayer
中,我在要调用多个不同DAO的函数之一上使用@Transactional
。
...
@Transactional
public List<DetailedInfo> getDetailedInfo() {
dao1.getDetailedInfo();
dao2.getDetailedInfo();
...
...
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的定义相似。
在这里,我没有关闭DAO中的entitymanager
。从ServiceLayer
的函数中使用@Transactional
批注调用DAO函数。据我了解,JpaLocalTxnInterceptor
有责任关闭EntityManager
范围内的所有@Transactional
。
交易后它还会释放数据库连接吗?