2017-02-21 49 views
1

在我與Wildfly 10,JAVA 8,MySQL和駱駝項目和休眠Wildfly - @TransactionAttribute -

的methodKO仍然存在實體orderEntity( 「KO」),呼叫methodOK,去的除外; methodOK堅持實體orderEntity( 「OK」)

儘管methodKO例外,我想在數據庫中發現orderEntity( 「OK」),所以我詮釋了methodOK用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 但這並不工作

這裏的細節上的配置文件:

獨立,全ha.xml:

<datasources> 
<xa-datasource jndi-name="java:jboss/datasources/myDS" pool-name="myDS" enabled="true" use-ccm="true"> 
.... 
</datasources> 

的persistence.xml:

<persistence-unit name="camel" transaction-type="JTA"> 
<jta-data-source>java:jboss/datasources/myDS</jta-data-source> 
.... 

爲myBean:

@Stateless 
public class MyBean { 
    @Inject 
    OrderDAO orderDAO; 

    private void methodKO() throws Exception { 
     orderDAO.create(new orderEntity("ko")); 
     methodOK(); 
     throw new Exception("err"); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    private void methodOK() { 
     orderDAO.create(new orderEntity("ok")); 
    } 

} 

回答

0

根據EJB 3.1:

事務屬性是與每個 下列方法相關聯的值:

a)一種的方法豆的商業接口

b)暴露thro呃 豆類無界面視圖

這意味着私有方法上的任何事務註釋都是無用的。

我將定義兩種這些方法爲公共

@Stateless 

public class MyBean { 
    @Inject 
    OrderDAO orderDAO; 

    public void methodKO() throws Exception { 
     orderDAO.create(new orderEntity("ko")); 
     methodOK(); 
     throw new Exception("err"); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void methodOK() { 
     orderDAO.create(new orderEntity("ok")); 
    } 

} 

這將是這個bean將實現實際包含一切的頂部這兩個方法的接口一個很好的做法。

+1

這將不能工作。對'methodOK'的調用是作爲常規方法調用進行的,它的註釋被忽略。 –

0

首先,拋出檢查的異常通常不會觸發事務回滾,除非您在特定的異常類型上使用@ javax.ejb.ApplicationException(rollback = true)專門爲此進行配置。未經檢查的異常默認情況下會觸發回滾。

由於Maciej很好地描述的原因,你需要改變你嘗試實現這個邏輯的方式。有幾個方式來實現你想要的行爲:

醜陋的方式:

@Stateless 
public class MyBean { 

    @Resource 
    private SessionContext sessionContext; 

    @Inject 
    OrderDAO orderDAO; 

    public void methodKO() throws Exception { 
     orderDAO.create(new orderEntity("ko")); 
     sessionContext.getBusinessObject(MyBean.class).methodOK(); 
     throw new RuntimeException("err"); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void methodOK() { 
     orderDAO.create(new orderEntity("ok")); 
    } 

} 

整潔的方式:

@Stateless 
public class MyBean { 

    @Inject 
    OrderDAO orderDAO; 

    public void methodKO() throws Exception { 
     orderDAO.create(new orderEntity("ko")); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void methodOK() { 
     orderDAO.create(new orderEntity("ok")); 
    } 

} 


@Stateless 
public class MyBusinessBean { 

    @Inject 
    private MyBean myBean; 

    public void businessMethod() { 
     myBean.methodKO(); 
     myBean.methodOK(); 
     throw new RuntimeException("Trip rollback"); 
    } 
}