2012-05-10 13 views
0

我有以下代碼:我應該拋出一個EJBException異常,以防止實體創建

JSF託管Bean:

@ManagedBean(name = "purchaseView") 
@ViewScoped 
public class PurchaseView implements Serializable { 

@EJB 
private PurchaseService service; 
private Order order; 

// Getter/Setters here 

public void checkoutOrder() { 
    // .. some checks for null here, then call service 
    service.checkout(order); 
} 
} 

服務:

@Stateless 
public class BuyVoucherService { 

@EJB 
private OrderBean orderBean; 
@EJB 
private ProductBean productBean; 

public boolean checkout(Order order) { 
    orderBean.create(order); 
    for(int i=0;i<order.getQuantity();i++) { 
    Product product = new Product(); 
    if(someCondition) { 
    // don't save anything and 
    return false; 
    } 
    // .. some setter here 
    product.setOrder(order); 
    productBean.create(product); 
    } 
    return true; 
} 

的一個ProductBean和orderBean是簡單的JPA EJB與EntityManager和CRUD操作(由Netbeans生成..)。 在上面的服務中,當服務返回時,事情會在數據庫中持久化。在這種情況下什麼是錯的(someCondition == TRUE以上),如果我返回false的orderBean.save(順序)仍然會堅持在數據庫的順序,我不希望出現這種情況。

拋出一個EJBException異常和捕捉它在ManagedBean最好的選擇?

+0

什麼是OrderBean中create()的事務屬性,它是默認的。 –

+0

是的,我沒有設置任何具體的事務屬性 – JScoobyCed

回答

1

由於您沒有指定任何事務屬性明確,這將是最有可能Required,而是取決於在服務器上。因此,這兩種方法都將處於同一事務中,因此,在方法中回滾將在另一個方法中級聯更改。

您也可以嘗試使用Mandatory屬性的第二個方法,這將確保它需要一個交易繼續進行,否則會導致運行時異常。

@Resource 
    private EJBContext context; 

    try{ 

     if(someCondition) { 
      throw SomeBusinessException("Failed, rolling back"); 
    } 

    }catch(Exception e){ 
     log(e.getMessage, e) 
     context.setRollbackOnly(); 
    } 

否則,您可以拋出系統異常,這將迫使容器回滾所做的更改。

if(someCondition) 
     throw SomeBusinessException("Failed, rolling back"); 

    }catch(Exception e){ 
     throw new EJBException (e.getMessage(), e); 
    } 
+0

感謝。我認爲EJBContext的方法是安全的,所以我們不依賴於容器來決定是否回滾與否(不嫌安全:)) – JScoobyCed

+0

@JScoobyCed不客氣。 –

相關問題