java/jakarta EE容器未调用JPA EntityManager.flush()
glassfish 5.1 EE容器未调用JPA EntityManager.flush() 在Java SE环境中:java/jakarta EE容器未调用JPA EntityManager.flush(),jpa,jakarta-ee,java-ee-8,Jpa,Jakarta Ee,Java Ee 8,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环境,例如Glassfish: @Stateless public class DataManagerB
EntityTransaction t = em.getTransaction();
t.begin();
// persist entities
em.persist(entity);
t.commit();
commit()将刷新持久性上下文中的实体
Java EE环境,例如Glassfish:
@Stateless
public class DataManagerBean {
@PersistenceContext
EntityManager em;
public void persist(Object entity) {
em.persist(entity);
}
}
JSFbean:
@Named
@ViewScoped
public class FooBean {
@EJB
DataManagerBean dataManagerBean;
public void createFoo() {
dataManagerBean.persist(foo);
}
}
应用程序无法调用em.getTransaction()。事务由容器管理。在调用entityManager.close()之前,不会调用JPA提供程序entityManager.flush()。因此,不会在数据库中创建实体
在EE环境中,JPA提供者EntityManager获得的数据库连接与container使用的数据库连接相同
如果未调用flush(),EE容器如何告诉JPA提供者将实体刷新到持久性?这取决于您调用业务方法的方式。一句话,Being defaulted——当您的流进入第一个业务方法(或拦截器,修饰您的第一个业务方法)时事务开始,当您的流离开堆栈中的最后一个业务方法(或拦截器,修饰您的第一个业务方法)时事务结束 您可以使用带有适当注释的注释管理事务(如果未注释,则默认为必需)。例如:
@Stateless
public class DataManagerBean {
@PersistenceContext
EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void persist(Object entity) {
em.persist(entity);
}
}
在本例中,名为DataManagerBean.persist的操作将启动新事务,并在离开时提交和刷新更改。如果出现错误,它将回滚事务并抛出您在调用业务方法时可以捕获的异常。这取决于您调用业务方法的方式。一句话,Being defaulted——当您的流进入第一个业务方法(或拦截器,修饰您的第一个业务方法)时事务开始,当您的流离开堆栈中的最后一个业务方法(或拦截器,修饰您的第一个业务方法)时事务结束 您可以使用带有适当注释的注释管理事务(如果未注释,则默认为必需)。例如:
@Stateless
public class DataManagerBean {
@PersistenceContext
EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void persist(Object entity) {
em.persist(entity);
}
}
在本例中,名为DataManagerBean.persist的操作将启动新事务,并在离开时提交和刷新更改。如果出现错误,它将回滚事务并抛出您在调用业务方法时可以捕获的异常。谁在调用
DataManagerBean
?JSF托管bean“事务由容器管理”您如何确切地确定这一点?您的实际问题表明情况并非如此。通过调试,使用Glassfish EntityManagerRapper和JavaEETransactionManagerSimplified代替JPA提供程序EntityTransaction。谁在调用DataManagerBean
?JSF托管bean“Transaction is managed by container”您如何确定这一点?您的实际问题表明情况并非如此。通过调试,Glassfish EntityManagerRapper和JavaEETransactionManagerSimplified被用来代替JPA提供程序EntityTransaction。Tryed default(必需)和TransactionAttributeType.REQUIRES_NEW,entityManager.flush()在这两种情况下都没有被容器调用。奇怪的行为。实际上,dataManagerBean.persist(foo)中的foo应该是有效的实体实例。是吗?在这两种情况下,容器都没有调用entityManager.flush()。奇怪的行为。实际上,dataManagerBean.persist(foo)中的foo应该是有效的实体实例。它是?