在SLSB中使用EJB3和entitymanager处理ConstraintViolationException的最佳方法是什么

时间:2010-10-29 16:33:26

标签: hibernate jpa jboss ejb-3.0

这是我的代码段:

@Stateless
public class mySLSB {

@PersistenceContext(unitName = "db")
private EntityManager myEntityManager;

 public void crud(MyEntity myEntity) throws MyException {
  myEntityManager.merge(myEntity);
 }
}

但是,这个合并会导致ConstraintViolationException,它不会抛出MyException(它在调用的servlet中被捕获)。

捕获hibernate异常的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

由于特殊原因,抛出了Hibernate异常。这些原因中的每一个都需要自己的治疗。对于某些例外,如ConstraintViolationException,您甚至必须区分它们是由用户错误还是服务器端错误引起的。如果用户提供了无效的输入数据,则必须告诉用户应该更正输入。如果服务器错误地操纵了数据,你必须告诉客户端出了问题,但这不是他/她的错。

但是,您可以执行的操作是在servlet中捕获HibernateException并根据实际的异常类型执行操作。根据捕获的异常情况,您应记录足够的信息以重现错误并相应地通知用户服务器端故障(包括他/她应该或可以做些什么来纠正原因)。

在您的示例代码中,我首先会在您的代码中搜索导致ConstraintViolationException的错误。如果用户提供了无效的输入数据,您可以通过调用getConstraintName()实例的ConstraintViolationException来提取详细信息。然后应记录此提取的信息并将其呈现给用户。

答案 1 :(得分:1)

  

但是,此合并可能会导致ConstraintViolationException,它不会抛出MyException(它在调用servlet中捕获)。捕获hibernate异常的最佳方法是什么?

使用JPA和EntityManager API时,您将获得javax.persistence.RollbackException作为原因的ConstraintViolationException。抓住RollbackException并使用getCause()进行检查。