0

私は次のコードを持っています:

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は、EntityManagerとCRUD操作(Netbeansによって生成されます)を備えた単純なJPAEJBです。上記のサービスでは、サービスが戻ったときにデータベースに保持されます。何かが間違っている場合(someCondition上記の== TRUE)、falseを返しても、orderBean.save(order)はデータベースに順序を保持し続けるので、それは望ましくありません。

EJBExceptionをスローし、それをManagedBeanでキャッチするのが最善のオプションですか?

4

1 に答える 1

1

トランザクション属性を明示的に指定していないため、おそらく指定されますがRequired、サーバーによって異なります。したがって、これらのメソッドは両方とも同じトランザクション内にあるため、メソッドをロールバックすると、変更が別のメソッドにカスケードされます。

2番目のメソッドに属性を使用することもでき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);
    }
于 2012-05-10T12:14:17.207 に答える