【发布时间】:2012-04-06 12:46:24
【问题描述】:
所以我在类级别用@TransactionAttribute(TransactionAttributeType.REQUIRED) 注释了这个EJB,这样每个方法都应该在事务中执行,除非我覆盖这个行为,当事务提交时,数据应该被刷新,对吧?到目前为止,一切都很好。
所以现在我有一个public User find(String email) 方法,用@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 注释,所以这个方法不会在事务中执行,因为它只获取数据。
好的,我正在测试我的应用程序,我有一个引导程序方法,它使用 ejb 创建几个实体,然后使用 find 方法获取一个。 在我看来,应该发生什么:
->我创建实体 1 调用 save(User u),它在事务中执行。它提交,数据被刷新。
->对另外 2 个实体重复此步骤。他们的事务提交,数据被刷新。
->此时我的二级缓存(使用 Eclipselink)和数据库中应该有 3 个实体。
->我调用find(String email) 方法。它找到一个实体,返回它,没有异常,我的代码执行得很好,我很兴奋,我打开啤酒,我不需要在 stackoverflow 中提问。
实际发生的情况:
->我创建了所有 3 个实体。也不例外。
->我调用find(String email)方法,因为没有找到实体,所以引发了EjbException,调试发现调用这个方法时,数据库是空的,没有数据被刷新(即使当我显式创建实体时,我调用了 flush 方法,无论如何这都不应该)。它抛出 EJbException,我的代码停止,我再次检查数据库,现在实体在那里,一旦抛出异常,因为它们不在那里。
如果我从 find 方法中删除 @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED),这会导致它在事务中执行搜索,我的代码就可以工作。
->我不开啤酒。
所以现在说真的,发生了什么事?为什么我需要在事务中搜索实体,否则它不会刷新任何内容?
编辑:持久性单元:
<?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>
没有引发异常,除了说我搜索时没有找到实体,之后缓存被刷新到数据库。
【问题讨论】:
标签: jpa ejb eclipselink jta