我正在使用 Glassfish 3.1.1(JSF 2、JPA 2、EclipseLink、Bean 验证)。
我正在尝试使用带有这些注释的 Bean Validation API 来实现验证:@Past
、@Future
和 @NotNull
。
它在插入或更新期间工作正常。不幸的是,当我尝试选择具有一些不正确值的 en 实体时,出现以下异常:
[#|2011-12-20T10:18:30.286+0100|WARNING|glassfish3.1.1|javax.enterprise.resource.jta.com.sun.enterprise.transaction|_ThreadID=36;_ThreadName=Thread-2;|DTX5014: Caught exception in beforeCompletion() callback:
javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'preUpdate'. Please refer to embedded ConstraintViolations for details.
at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.validateOnCallbackEvent(BeanValidationListener.java:90)
at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.preUpdate(BeanValidationListener.java:72)
我在规范中看到我可以使用此属性 javax.persistence.ValidationMode
禁用 JPA 验证,但是如何在选择期间禁用验证而不是在插入或更新期间禁用?
预先感谢您的帮助。
最佳答案
问题是持久性上下文中的任何内容都将被验证。
您可以避免将对象添加到持久性上下文,方法是在事务外的不同 EntityManager 中读取它们,或者在读取它们的查询中使用“eclipselink.read-only”提示。
虽然没有更改的对象正在被验证,但这看起来确实很奇怪。如果是这种情况,那么可能会记录一个错误。
关于validation - 在选择期间绕过 Bean 验证但不在插入/更新期间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8573350/