0

我在独立的 Java 应用程序中使用 EclipseLink 2.5 和 JPA 2.1。

某些字段标有@Basic(optional=false),但即使使用空值,我在提交之前也没有收到任何错误。约束是在数据库上设置的,所以我得到了一个 JDBC 异常。

将 Hibernate Validator 添加到项目并将验证模式设置为回调没有帮助。

只有在字段上使用@NotNull 注释时,我才得到异常:javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details.这不是很具体,也不会告知问题出在哪里。

我想知道是否有任何方法可以使此消息看起来更健壮:例如未设置字段名称或类似的东西并强制 eclipselink 检查 optional=false。

编辑:我知道 JPA 和 Bean Validation 之间的区别。我正在尝试仅使用 JPA 执行验证,使用 optional=false。据我所知(@Basic(optional = false) vs @Column(nullable = false) in JPA)@Basic(optional=false) 应该在运行时检查,@Column(nullable=false) 应该用于制作列在数据库中不可为空。

我正在寻找一种方法来显示违规行为,而不会到处捕获 ConstraintViolations。

4

2 回答 2

1

这里有几件事。首先你必须区分 JPA 和 Bean Validation。两种不同的规格和东西。@Basic 是 JPA 注释,而 @NotNull 是 Bean Validation 注释。将@Basic(optional=false) 与模式创建结合使用,您确实会得到一个数据库约束,这反过来会在持久化期间导致 JDBC 异常。

通过引入 Bean Validation,您可以激活 Bean Validation 的 JPA 集成。在这种情况下,在写入数据库之前,数据将通过 Bean Validation 进行验证。在这种情况下,作为 pre-persist 的一部分。根据规范,在这种情况下会引发 ConstraintViolationException。您可以调用 ConstraintViolationException.getConstraintViolations 来获取一组失败的约束。由您自己来捕获此异常并进行解包。

于 2013-09-10T10:11:56.813 回答
0

我正在寻找一种方法来显示违规行为,而不会到处捕获 ConstraintViolations。

您可以在应用程序代码的最外层添加一个catch(ConstraintViolationException cve) {...}块(例如,以某种请求处理程序/拦截器的形式,以防这是一个 Web 应用程序)并使用它以通用方式处理约束违规。该ConstraintViolation对象提供了许多信息,例如相关属性的名称等。不过,我不确定为什么 EclipseLink 不考虑@Basic(optional=false)

于 2013-09-13T06:58:14.737 回答