Jsf 2 我应该抛出EJBException来阻止实体创建吗

Jsf 2 我应该抛出EJBException来阻止实体创建吗,jsf-2,jpa-2.0,Jsf 2,Jpa 2.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() { // .. so

我有以下代码:

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;
 }
@无状态
公共类购买凭证服务{
@EJB
私有OrderBean OrderBean;
@EJB
私人产品豆;
公共布尔签出(订单){
创建(订单);

对于(int i=0;i,由于您没有明确指定任何事务属性,它很可能是
必需的
,但取决于服务器。因此,这两个方法将位于同一事务中,因此在一个方法中回滚将在另一个方法中级联更改

您还可以尝试对第二种方法使用
强制
属性,它将确保需要进一步处理事务,否则将导致运行时异常

    @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);
    }

OrderBean中create()的事务属性是什么,是否默认。是的,我没有设置任何特定的事务属性。我认为EJBContext方法更安全,因此我们不依赖容器来决定是否回滚(永远都不太安全:)