0

我的 Java EE 6 应用程序中有这样的托管 bean:

@Named
@RequestScoped
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class RegistrationBean implements Serializable {

    @PersistenceContext
    EntityManager em;

    public String doRegistration() {
        MyEntity entity = new MyEntity();
        em.persist(entity);
        return "view";
    }
}

据我了解@TransactionAttribute,应该自动创建新事务。但显然不是,因为我遇到了一个例外:javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction

我的持久性单元具有transaction-type="JTA"属性。我正在使用 JBoss 6 cr1。

4

4 回答 4

5

您尝试做的事情并不完全正确。您定义的是一个普通的 CDI bean,它本身不支持 @TransactionAttribute 注释。此注释用于 EJB bean,您将通过使用 @Stateless 注释获得它。

请注意,在这种情况下,您不一定需要使用 TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 注释。默认情况下,在使用 @Stateless 注释 bean 时,您已经获得了 TransactionAttributeType.REQUIRES,这在大多数情况下是您想要的。

于 2010-11-28T00:54:18.703 回答
1

默认情况下,CDI 不支持容器管理事务。但是,使用 Seam 3 Persistence 模块,您可以将 CMT 支持添加到您的应用程序中。

Seam Persistence 文档在这里 -->链接

首先,将 Seam Persistence jar 添加到您的项目中:

<dependency>
  <groupId>org.jboss.seam.persistence</groupId>
  <artifactId>seam-persistence-api</artifactId>
  <version>${seam.persistence.version}</version>
</dependency>

<dependency>
  <groupId>org.jboss.seam.persistence</groupId>
  <artifactId>seam-persistence-impl</artifactId>
  <version>${seam.persistence.version}</version>
</dependency>

<dependency>
  <groupId>org.jboss.seam.solder</groupId>
  <artifactId>seam-solder</artifactId>
  <version>${seam.solder.version}</version>
</dependency>

接下来,在beans.xml中启用声明式事务管理

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee 
      http://docs.jboss.org/cdi/beans_1_0.xsd">

   <interceptors>
      <class>org.jboss.seam.persistence.transaction.TransactionInterceptor</class>
   </interceptors>
</beans>

现在,根据文档,您应该能够像使用 EJB 一样对托管 bean 使用 @TransactionAttribute 注释,但是,我无法让它工作。但是,您可以在您的类或方法上使用@Transactional注释。这是 Seam Persistence 等效项,并且工作正常。

希望这可以帮助。有任何问题,尽管问。

于 2011-01-24T19:45:10.317 回答
1

@TransactionAttribute 是一个 EJB 注释。我不相信 CDI 容器像 EJB 容器那样提供事务管理。

您的情况的一种解决方案是将数据库访问功能放入无状态 EJB 并将其注入 RegistrationBean。话虽如此,您无需指定 TransactionAttributeType.REQUIRES_NEW 即可获得自动事务处理。除非您计划从运行另一个事务的方法中调用 EJB 方法,并且您希望被调用的方法在与原始事务不同的事务中运行,否则隐式默认值 REQUIRES 就足够了。

于 2010-11-28T00:46:12.907 回答
0

TransactionAttributeType.REQUIRE* D *

于 2013-08-01T17:42:23.663 回答