HibernateValidator 5似乎没有对JPA实体进行级联验证
我对Hibernate和Hibernate Validator 5有问题。我有一些实体,比如说HibernateValidator 5似乎没有对JPA实体进行级联验证,hibernate,validation,hibernate-validator,Hibernate,Validation,Hibernate Validator,我对Hibernate和Hibernate Validator 5有问题。我有一些实体,比如说Group和另一个实体Person。它们的关系如下:组中有两个对人的引用-联系人和经理。它们都是一对一关系,具有完全级联和孤立删除选项 我想要的是在保存组时验证联系人和经理。此外,我希望使用不同的验证组来验证联系人和经理。为了做到这一点,我将@ConvertGroup(from=Default.class,to=ContactPersonValidation.class)与@Valid一起放在联系人字段
Group
和另一个实体Person
。它们的关系如下:组中有两个对人的引用-联系人和经理。它们都是一对一关系,具有完全级联和孤立删除选项
我想要的是在保存组时验证联系人和经理。此外,我希望使用不同的验证组来验证联系人和经理。为了做到这一点,我将@ConvertGroup(from=Default.class,to=ContactPersonValidation.class)
与@Valid
一起放在联系人字段之前,并对经理字段进行了类似的操作(使用不同的验证组)
现在,Hibernate验证不起作用-我的意思是该组未转换为@ConvertGroup
中提供的组。我遵循Hibernate validator的源代码,它似乎分别验证组对象和两个人对象。因此,人员验证不会从组对象级联,验证组也不会转换
您是否曾经遇到过类似的问题并知道如何解决它?在JPA触发的生命周期验证期间,Bean验证使用
可遍历解析器
,如果它们标记有@Valid
(请参阅3.6.1.2“生命周期事件自动验证的要求”),则该解析器不会跟踪关联JPA2.0规范中的)
因此,您的个人
对象不会通过跟踪组
中的引用进行验证,而是在它们自身被持久化时进行验证。因此,在group
上声明的组转换不适用
您可以通过定义for
Person
来实现所需的行为(请注意,这是Hibernate验证器特有的特性)。为此,您必须将人员的“角色”(例如,以带有值Contact
和Manager
的枚举形式)传递给人员
实例。如果给定的人员
实例被持久化,则默认组序列提供程序可以访问该角色并应用一个或另一个验证组。如果显示实际的注释实体以及如何保存/持久化实体,这将有所帮助。您使用的是本机Hibernate会话还是JPA?如何进行验证?您是否依赖基于生命周期的验证?我使用本机Hibernate会话,并且依赖基于生命周期的验证。我知道它使用TraversableResolver
,并且不跟踪关联。我已经按照您描述的方式(使用GroupSequenceProvider)完成了这项工作,但我希望有一些技巧可以更好地(或者“更干净”)完成这项工作:)