即使使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW),也不会自动创建事务

时间:2010-11-28 00:30:43

标签: java-ee java-ee-6 jta

我的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 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

您的案例的一个解决方案是将数据库访问功能放入无状态EJB并将其注入RegistrationBean。话虽这么说,您不需要指定TransactionAttributeType.REQUIRES_NEW以获得自动事务处理。除非您计划从运行另一个事务的方法调用EJB方法,并且您希望被调用的方法在与原始事务不同的事务中运行,否则隐式缺省值REQUIRES应该足够了。

答案 2 :(得分:1)

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

Seam Persistence文档在这里 - > Link

首先,将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的等价物并且工作正常。

希望这会有所帮助。有问题,请问。

答案 3 :(得分:0)

TransactionAttributeType.REQUIRE * d *