java/jakarta EE容器未调用JPA EntityManager.flush()

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

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 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应该是有效的实体实例。它是?