Java Spring:对@Transactional和rollback的最佳使用

Java Spring:对@Transactional和rollback的最佳使用,java,spring,hibernate,spring-mvc,jpa,Java,Spring,Hibernate,Spring Mvc,Jpa,在这两个示例中,我使用了Spring+JPA+Hibernate。两种形式中哪一种是正确的?在第一个示例中,未选中MyException,而在第二个示例中,选中MyException。谢谢你,对不起我的英语 第一个例子 CartController.java @RequestMapping(value="/buy",method=RequestMethod.POST) public String buy(){ CartDAO.buy(); return "redirect:/";

在这两个示例中,我使用了Spring+JPA+Hibernate。两种形式中哪一种是正确的?在第一个示例中,未选中MyException,而在第二个示例中,选中MyException。谢谢你,对不起我的英语

第一个例子 CartController.java

@RequestMapping(value="/buy",method=RequestMethod.POST)
  public String buy(){
  CartDAO.buy();
  return "redirect:/";
 }//buy
@ControllerAdvice
public class ExceptionController {

@ExceptionHandler(MyException.class)
public String articlenotavailable(){
    return "error/articlenotavailable";
}

}//ExceptionController
@RequestMapping(value="/buy",method=RequestMethod.POST)
  public String buy()throws MyException{
  CartDAO.buy();
  return "redirect:/";
 }//buy
@ControllerAdvice
public class ExceptionController {

@ExceptionHandler(MyException.class)
public String articlenotavailable(){
    return "error/articlenotavailable";
}

}//ExceptionController
CartDAOImpl.java

@Transactional(rollbackfor=MyException.class)
public class CartDAOImpl implements CartDAO {

@PersistenceContext
private EntityManager em;

public void buy(){
 ....
 if(x !=y) throw new MyException();
 em.persist(Item);
 ....
}
}
@Transactional(rollbackfor=MyException.class)
public class CartDAOImpl implements CartDAO {

@PersistenceContext
private EntityManager em;

public void buy()throws MyException{
 ....
 if(x !=y) throw new MyException();
 em.persist(Item);
 ....
}
}
ExceptionController.java

@RequestMapping(value="/buy",method=RequestMethod.POST)
  public String buy(){
  CartDAO.buy();
  return "redirect:/";
 }//buy
@ControllerAdvice
public class ExceptionController {

@ExceptionHandler(MyException.class)
public String articlenotavailable(){
    return "error/articlenotavailable";
}

}//ExceptionController
@RequestMapping(value="/buy",method=RequestMethod.POST)
  public String buy()throws MyException{
  CartDAO.buy();
  return "redirect:/";
 }//buy
@ControllerAdvice
public class ExceptionController {

@ExceptionHandler(MyException.class)
public String articlenotavailable(){
    return "error/articlenotavailable";
}

}//ExceptionController
MyException.java

public class MyException extends RuntimeException {
private static final long serialVersionUID = 1L;
}
public class MyException extends Exception {
private static final long serialVersionUID = 1L;
} 
第二个例子 CartController.java

@RequestMapping(value="/buy",method=RequestMethod.POST)
  public String buy(){
  CartDAO.buy();
  return "redirect:/";
 }//buy
@ControllerAdvice
public class ExceptionController {

@ExceptionHandler(MyException.class)
public String articlenotavailable(){
    return "error/articlenotavailable";
}

}//ExceptionController
@RequestMapping(value="/buy",method=RequestMethod.POST)
  public String buy()throws MyException{
  CartDAO.buy();
  return "redirect:/";
 }//buy
@ControllerAdvice
public class ExceptionController {

@ExceptionHandler(MyException.class)
public String articlenotavailable(){
    return "error/articlenotavailable";
}

}//ExceptionController
CartDAOImpl.java

@Transactional(rollbackfor=MyException.class)
public class CartDAOImpl implements CartDAO {

@PersistenceContext
private EntityManager em;

public void buy(){
 ....
 if(x !=y) throw new MyException();
 em.persist(Item);
 ....
}
}
@Transactional(rollbackfor=MyException.class)
public class CartDAOImpl implements CartDAO {

@PersistenceContext
private EntityManager em;

public void buy()throws MyException{
 ....
 if(x !=y) throw new MyException();
 em.persist(Item);
 ....
}
}
ExceptionController.java

@RequestMapping(value="/buy",method=RequestMethod.POST)
  public String buy(){
  CartDAO.buy();
  return "redirect:/";
 }//buy
@ControllerAdvice
public class ExceptionController {

@ExceptionHandler(MyException.class)
public String articlenotavailable(){
    return "error/articlenotavailable";
}

}//ExceptionController
@RequestMapping(value="/buy",method=RequestMethod.POST)
  public String buy()throws MyException{
  CartDAO.buy();
  return "redirect:/";
 }//buy
@ControllerAdvice
public class ExceptionController {

@ExceptionHandler(MyException.class)
public String articlenotavailable(){
    return "error/articlenotavailable";
}

}//ExceptionController
MyException.java

public class MyException extends RuntimeException {
private static final long serialVersionUID = 1L;
}
public class MyException extends Exception {
private static final long serialVersionUID = 1L;
} 

这些我都不推荐。事务应该在比dao更高的层中处理,例如服务,甚至更高的层。我同意Luiggi的观点,尽管这也是一个命名问题:您命名的dao实际上是一个包含业务逻辑的服务,应该将其持久性操作委托给dao。DAO将有find/create/update/delete方法,而不是buy方法。关于异常,选中的异常将成为阻碍。由于您所能做的和想要做的都是在顶级异常处理程序中处理它们,因此更喜欢未经检查的异常。CartDAO除了包含buy方法外,还包含以下方法:addToCart、removeFromCart、updateQuantityArticle。对你来说,我是用移动的方式买的吗?因此,最好的解决方案是不检查异常,对吗?您能更正代码并移动buy方法吗?谢谢所有这些都是商业方法。您的DAO应该重命名。您应该引入一个真正的DAO,它包含一些简单的方法,如findById()、create()等。