Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EntityManager.persist()之后会发生什么_Java_Jpa_Java Ee 6_Glassfish 3 - Fatal编程技术网

Java EntityManager.persist()之后会发生什么

Java EntityManager.persist()之后会发生什么,java,jpa,java-ee-6,glassfish-3,Java,Jpa,Java Ee 6,Glassfish 3,EntityManger注入了@PersistenceContext注释。这是我的“DAO/Repository”类中的一个方法,没有注释。这个类被注入到需要从数据库获取数据的EJB中 到目前为止,我一直认为在下面的persist方法完成后,persistencecontext会被刷新,数据会存储到数据库中,但从我的应用程序中发生的事情来看,我开始怀疑这一点。我在Glassfish中创建了数据源和连接池,因此据我所知,我使用的是容器管理的事务,但是我不使用任何事务注释 有人能帮我照一下吗 pub

EntityManger注入了
@PersistenceContext
注释。这是我的“DAO/Repository”类中的一个方法,没有注释。这个类被注入到需要从数据库获取数据的EJB中

到目前为止,我一直认为在下面的persist方法完成后,persistencecontext会被刷新,数据会存储到数据库中,但从我的应用程序中发生的事情来看,我开始怀疑这一点。我在Glassfish中创建了数据源和连接池,因此据我所知,我使用的是容器管理的事务,但是我不使用任何事务注释

有人能帮我照一下吗

public void persist(QuestionFeedback questionFeedback) {
    questionFeedback.setCreated(new Date());
    entityManager.persist(questionFeedback);
}

使用Glassfish 3、Java EE6兼容性

如果不使用任何事务注释,默认情况下将需要事务。因此,DAO将在事务中运行,并且持久性上下文不会晚于事务提交时刷新

TransactionAttribute
上的JavaDoc:

如果未指定TransactionAttribute注释,并且bean使用容器管理的事务划分,则假定所需事务属性的语义

FlushModeType
上的JavaDoc:

在事务内执行查询时,如果在查询或TypedQuery对象上设置了FlushModeType.AUTO,或者如果持久性上下文的刷新模式设置为AUTO(默认设置),并且尚未为查询或TypedQuery对象指定刷新模式设置,持久性提供程序负责确保持久性上下文中所有实体状态的所有更新对查询处理可见,这些更新可能会影响查询结果


这意味着,如果您使用的查询的结果可能会受到刷新的影响,那么持久性上下文可能会提前刷新。

persist方法使实体持久化,但尚未将更改写入数据库。这通常在事务提交时发生(提供者可以自由地对此进行优化,可以更早发生)

使用
flush
可以强制更早地进行写入,但它仍将仅对参与当前事务的代码可见。要使写操作永久(对所有外部代码可见),仍然需要提交事务


如果没有任何显式注释,您的EJB bean在默认情况下将是事务性的。

因为EntityManager是通过@PersistenceContext注释注入的,所以您肯定使用容器管理的事务

无论如何,您认为persist导致事务提交的假设是错误的。通过persist执行的更改在commit中对数据库进行。EntityManager的文档说明“通过调用persist,新实例既可以被管理,也可以被持久化”。在这个上下文中,“变得持久化”并不意味着实体在那个时刻被持久化到数据库。在调用persist时,实体将以PersistenceContext的形式持久化。随后,当事务提交时,它将被保存到数据库中


因为您的方法没有使用任何@TransactionAttribute注释,所以将应用默认值。默认值为TransactionAttributeType.REQUIRED。这将导致容器在调用第一个业务方法时创建事务,并将其传播到其他方法。当对第一个业务方法的调用完成时,您的事务将提交。那么您的更改就在数据库中(如果没有执行回滚)。

那么您要说的是业务方法打开和关闭事务(在我的代码中调用上面的persist方法),然后提交事务?或者我误解了您的意思?是的,如果调用persist方法的方法的客户端没有事务上下文。然后,在您的情况下,容器必须在方法的开始和结束部分关注事务的开始和提交。如果客户机已有事务,那么您的方法将连接到该事务,并在客户机的某个位置进行提交。不管有多少层没有定义事务属性的方法调用,逻辑保持不变:事务在第一层中启动并提交。