gpt4 book ai didi

jpa - 了解 EJB : Not flushing 中的 JTA

转载 作者:行者123 更新时间:2023-12-01 01:20:14 27 4
gpt4 key购买 nike

所以我在类级别用 @TransactionAttribute(TransactionAttributeType.REQUIRED) 注释了这个 EJB ,以便每个方法都应该在事务中执行,除非我覆盖此行为,当事务提交时,数据将被刷新,对吗?到现在为止还挺好。
所以现在我有一个 public User find(String email)方法,注释为 @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)所以这个方法不会在事务中执行,因为它只获取数据。

好的,所以我正在测试我的应用程序,我有一个 bootstrap 方法,该方法使用 ejb 创建几个实体,然后使用 find 方法获取一个。
在我看来,应该发生什么:

->我创建实体 1 调用 save(User u)这是在事务中执行的。它提交,数据被刷新。

->对另外 2 个实体重复此步骤。他们的事务提交,数据被刷新。

->此时,我的 L2 缓存(使用 Eclipselink)和数据库中应该有 3 个实体。

->我调用find(String email)方法。它找到一个实体,返回它,没有异常(exception),我的代码执行得很好,我很兴奋,我打开了啤酒,我不需要在stackoverflow中提问。

实际发生的情况:

->我创建了所有 3 个实体。没有异常(exception)。

->我调用find(String email)方法,它引发一个 EjbException 因为它没有找到实体,调试我发现当这个方法被调用时,数据库是空的,没有数据被刷新(即使我在显式创建实体时调用了flush方法) ,这无论如何都不是必需的)。它抛出 EJbException,我的代码停止,我再次检查数据库,现在实体在那里,一旦抛出异常,因为它们不存在。
如果我删除 @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)从 find 方法中,它导致它在事务内执行搜索,我的代码有效。

->我不开啤酒。

所以现在说真的,这是怎么回事?为什么我需要在事务中搜索实体,否则它不会刷新任何内容?

编辑:持久性单元:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="TribunalExpedientes" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>tribunalexpedientes</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ALL</shared-cache-mode>
<properties>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
</properties>
</persistence-unit>
</persistence>

除了说在我搜索时没有找到任何实体之外,没有引发异常,之后,缓存被刷新到数据库中。

最佳答案

我的猜测是您没有正确配置。包括您的persistence.xml 以及您正在使用的应用程序服务器和数据库。

您使用的是 JTA 还是 RESOURCE_LOCAL,您应该使用 JTA 并且应该在您的 persistence.xml 中设置您的目标服务器。

还要检查是否有任何错误。如果发生错误,则事务将回滚。

NOT_SUPPORTED 通常不是一个好主意,这意味着如果在事务中调用此方法将引发异常。这可能是正在发生的事情。

关于jpa - 了解 EJB : Not flushing 中的 JTA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9814113/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com