有没有办法找出(在运行时)哪个实体导致了ConstraintViolationException?

时间:2011-11-03 15:58:52

标签: java hibernate

我有一个(REST)应用程序来处理由第三方发起的CRUD操作,基本上我的问题是在违反约束的情况下返回一个容易理解的错误消息。我正在使用Hibernate(尽管JPA解决方案会更好)并且它抛出的ConstraintViolationException并不是非常有用,它甚至没有被违反的约束的名称。到目前为止,我一直在返回constraintViolation.getSQLException().getMessage(),它会在Duplicate entry '<value>' for key 2的行中返回一条不错的消息。

问题是一个新的要求,以改善返回的错误,包括 实体未能提交的值以及值(以及它作为自定义错误代码的失败类型; DUPLICATE_VALUE,MISSING_FOREIGN_KEY , 或类似的东西)。由于上面的字符串来自SQLException,我认为它取决于数据库/驱动程序,所以虽然我可以从该字符串中挑选出''并搜索每个对象中的每个字段,我只是提交尝试找到合适的选项,它看起来并不是一个强大的选项(特别是因为我们需要支持多个数据库)。

那么有什么方法可以根据手头的信息找到这些信息吗? (这基本上只是带有SQLException的ConstraintViolationException和我试图保留的对象。)

2 个答案:

答案 0 :(得分:1)

这就是为什么你应该在业务逻辑中验证提供的数据,而不是依靠Hibernate来实现它。 Web框架就是出于这个原因提供验证机制。

答案 1 :(得分:0)

应该可以专门捕获该异常并返回有意义的响应,而不是通用异常并解析它以理解,重新考虑这一点是值得的。只是我的2c的