Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 在SLSB中使用EJB3和entitymanager处理ConstraintViolationException的最佳方法是什么_Hibernate_Jpa_Jboss_Ejb 3.0 - Fatal编程技术网

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

Hibernate 在SLSB中使用EJB3和entitymanager处理ConstraintViolationException的最佳方法是什么,hibernate,jpa,jboss,ejb-3.0,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); } } 但是,此合并可能导致ConstraintViolation

以下是我的代码片段:

@Stateless
public class mySLSB {

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

 public void crud(MyEntity myEntity) throws MyException {
  myEntityManager.merge(myEntity);
 }
}
但是,此合并可能导致ConstraintViolationException,它不会抛出MyException(在调用servlet中捕获)


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

由于特殊原因会引发hibernate异常。这些原因中的每一个都需要单独处理。对于一些异常,如
ConstraintViolationException
,您甚至必须区分它们是由用户错误还是服务器端错误引起的。如果用户提供了无效的输入数据,您必须告诉用户应更正输入。如果服务器错误地操作了数据,您必须告诉客户出了问题,但这不是他/她的错

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

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

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


当使用JPA和EntityManager API时,您将得到一个
javax.persistence.RollbackException
,原因是
ConstraintViolationException
。因此,捕获
RollbackException
并使用
getCause()
检查它。

对于相同单元测试中的相同违规,eclipselink首先抛出CVE,hibernate首先抛出RB。哪一个是正确的行为?