这是我的代码段:
@Stateless
public class mySLSB {
@PersistenceContext(unitName = "db")
private EntityManager myEntityManager;
public void crud(MyEntity myEntity) throws MyException {
myEntityManager.merge(myEntity);
}
}
但是,这个合并会导致ConstraintViolationException,它不会抛出MyException(它在调用的servlet中被捕获)。
捕获hibernate异常的最佳方法是什么?
答案 0 :(得分:1)
由于特殊原因,抛出了Hibernate异常。这些原因中的每一个都需要自己的治疗。对于某些例外,如ConstraintViolationException
,您甚至必须区分它们是由用户错误还是服务器端错误引起的。如果用户提供了无效的输入数据,则必须告诉用户应该更正输入。如果服务器错误地操纵了数据,你必须告诉客户端出了问题,但这不是他/她的错。
但是,您可以执行的操作是在servlet中捕获HibernateException
并根据实际的异常类型执行操作。根据捕获的异常情况,您应记录足够的信息以重现错误并相应地通知用户服务器端故障(包括他/她应该或可以做些什么来纠正原因)。
在您的示例代码中,我首先会在您的代码中搜索导致ConstraintViolationException
的错误。如果用户提供了无效的输入数据,您可以通过调用getConstraintName()
实例的ConstraintViolationException
来提取详细信息。然后应记录此提取的信息并将其呈现给用户。
答案 1 :(得分:1)
但是,此合并可能会导致ConstraintViolationException,它不会抛出MyException(它在调用servlet中捕获)。捕获hibernate异常的最佳方法是什么?
使用JPA和EntityManager API时,您将获得javax.persistence.RollbackException
作为原因的ConstraintViolationException
。抓住RollbackException
并使用getCause()
进行检查。