我的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。
答案 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 *