2010-11-28 57 views
0

我在我的Java EE 6的應用,例如託管bean:交易不會自動創建即使@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)用於

@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。

回答

1

@TransactionAttribute是一個EJB註釋。我不相信CDI容器提供像EJB容器那樣的事務管理。

針對您的情況的一種解決方案是將數據庫訪問功能放入無狀態EJB中並將其注入到RegistrationBean中。這就是說,你不需要指定TransactionAttributeType.REQUIRES_NEW來獲得自動事務處理。除非您計劃從運行其他事務的方法調用EJB方法,並且您希望被調用的方法在與原始單獨的事務中運行,否則隱式默認值REQUIRES就足夠了。

4

你所要做的並不完全正確。你定義的是一個普通的CDI bean,它本身不支持@TransactionAttribute註解。這個註解用於EJB bean,您將通過使用@Stateless註釋來獲得該註釋。

請注意,在這種情況下,您不一定需要使用TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)註釋。默認情況下,當使用@Stateless註釋bean時,您已經獲得了TransactionAttributeType.REQUIRES,在大多數情況下,這是您想要的。

1

默認情況下,CDI不支持容器管理事務。但是,使用Seam 3 Persistence模塊,您可以將CMT支持添加到您的應用程序。

Seam的持久性文件是在這裏 - >Link

首先,添加Seam的持久性罐子到項目中:

<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> 

現在,根據文檔,您應該能夠使用@TransactionA像使用EJB一樣爲託管bean賦予註釋,但是,我無法使其工作。不過,您可以在您的課程或方法上使用註釋。這是Seam Persistence等價物,並且工作正常。

希望這會有所幫助。任何問題,只要問。

0

TransactionAttributeType.REQUIRE * D *

相關問題