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

Java 有没有办法(在运行时)找出哪个实体导致了ConstraintViolationException?,java,hibernate,Java,Hibernate,我有一个(REST)应用程序来处理由第三方发起的CRUD操作,基本上我的问题是在违反约束的情况下返回一个容易理解的错误消息。我使用的是Hibernate(虽然JPA解决方案会更好),它抛出的ConstraintViolationException并不是非常有用,它甚至没有被违反的约束的名称。到目前为止,我一直在返回constraintViolation.getSQLException().getMessage(),它返回了一条相当不错的消息,其中包含键2的重复条目“” 问题在于,需要改进返回的错

我有一个(REST)应用程序来处理由第三方发起的CRUD操作,基本上我的问题是在违反约束的情况下返回一个容易理解的错误消息。我使用的是Hibernate(虽然JPA解决方案会更好),它抛出的ConstraintViolationException并不是非常有用,它甚至没有被违反的约束的名称。到目前为止,我一直在返回
constraintViolation.getSQLException().getMessage()
,它返回了一条相当不错的消息,其中包含键2的
重复条目“”

问题在于,需要改进返回的错误,以包括未能提交的实体和值(以及作为自定义错误代码的失败类型;重复的\u值、缺少\u外键或类似的内容)。因为上面的字符串来自SQLException,所以我假设它取决于DB/驱动程序,所以虽然我可以从该字符串中选择“”并搜索每个对象中的每个字段,但我刚刚提交的每个对象都试图找到正确的字段,但它似乎并不是一个健壮的选项(特别是当我们需要支持多个数据库时)


那么,根据手头的信息,我有没有办法找到这些信息?(这基本上只是ConstraintViolationException w/SQLException和我试图持久化的对象)。

这就是为什么您应该在业务逻辑中验证提供的数据,而不是依赖Hibernate来完成。Web框架提供验证机制正是出于这个原因。

这就是为什么您应该在业务逻辑中验证提供的数据,而不是依赖Hibernate来完成。Web框架提供验证机制正是出于这个原因。

应该可以专门捕获该异常并返回有意义的响应,而不是一般的异常并对其进行解析以理解,值得重新考虑这一点。就我的2c而言

应该可以专门捕获该异常并返回有意义的响应,而不是一般异常并对其进行解析以理解,这是值得重新考虑的。仅我的2c

我们使用Hibernate验证框架,但据我所知,我们无法从它连接到数据库。此外,我也不确定我们是否愿意这样做,因为一个事务中可能有数千条提交的记录。事实上,我们必须跳转到数据库,检查它是否有效,而那些无效的将非常罕见;真的值得在提交之前额外跳转到(远程)数据库进行检查吗?即使这样,也不可能保证不会发生空中碰撞。根据数据库的大小,这可能不会对性能造成重大影响,因为Hibrate使用缓存。几乎可以保证所讨论的内容不在缓存中。然而,这似乎是唯一可行的办法。检查后仍然存在提交竞争条件的问题,但总比没有好。我们使用Hibernate验证框架,但据我所知,我们无法从它连接到数据库。此外,我也不确定我们是否愿意这样做,因为一个事务中可能有数千条提交的记录。事实上,我们必须跳转到数据库,检查它是否有效,而那些无效的将非常罕见;真的值得在提交之前额外跳转到(远程)数据库进行检查吗?即使这样,也不可能保证不会发生空中碰撞。根据数据库的大小,这可能不会对性能造成重大影响,因为Hibrate使用缓存。几乎可以保证所讨论的内容不在缓存中。然而,这似乎是唯一可行的办法。检查后仍然存在提交竞争条件的问题,但总比什么都没有好。SQLException和ConstraintViolationException都没有向我证明有很多有用的信息,但我可以访问这两个信息。我不确定你建议我抓住什么例外。或者你认为我应该如何重构。文档给出了约束,但没有给出更多细节。这只是我捕获的异常的一个超类。我真的不明白你的意思。SQLException和ConstraintViolationException都没有向我证明有很多有用的信息,但我可以访问这两个。我不确定你建议我抓住什么例外。或者你认为我应该如何重构。文档给出了约束,但没有给出更多细节。这只是我捕获的异常的一个超类。我真的不明白你的意思。