【发布时间】:2020-11-26 00:33:53
【问题描述】:
glassfish 5.1 EE 容器不调用 JPA EntityManager.flush()。
在 Java SE 环境中:
EntityTransaction t = em.getTransaction();
t.begin();
// persist entities
em.persist(entity);
t.commit();
commit() 将刷新持久化上下文中的实体。
Java EE 环境,例如玻璃鱼:
@Stateless
public class DataManagerBean {
@PersistenceContext
EntityManager em;
public void persist(Object entity) {
em.persist(entity);
}
}
JSF 豆:
@Named
@ViewScoped
public class FooBean {
@EJB
DataManagerBean dataManagerBean;
public void createFoo() {
dataManagerBean.persist(foo);
}
}
应用程序不能调用 em.getTransaction()。事务由容器管理。在调用 entityManager.close() 之前,不调用 JPA 提供程序 entityManager.flush()。因此,实体没有在数据库中创建。
在EE环境下,JPA提供者EntityManager获取的数据库连接和容器使用的一样吗?
如果不调用 flush(),EE 容器如何告诉 JPA 提供者刷新实体以持久化?
【问题讨论】:
-
谁在打电话
DataManagerBean? -
JSF 托管 bean
-
“事务由容器管理” 您对此有何把握?您的实际问题表明情况并非如此。
-
从调试来看,使用 Glassfish EntityManagerWrapper 和 JavaEETransactionManagerSimplified 代替 JPA 提供者 EntityTransaction。
标签: jpa jakarta-ee java-ee-8