我遇到了Hibernate和Hibernate Validator 5的问题。我有一些实体,比方说Group
和另一个实体Person
。它们的关联如下:集团有两个人参考 - 联系人和经理。它们是完全级联和孤立删除选项的一对一关系。
我想要的是在保存群组时验证联系人和管理员。我想要一个不同的验证组来验证联系人和经理。为了做到这一点,我在联系人字段之前将@ConvertGroup(from = Default.class, to = ContactPersonValidation.class)
和@Valid
放在一起,我为管理员字段(使用不同的验证组)类似地做了。
现在,Hibernate验证不起作用 - 我的意思是该组未转换为@ConvertGroup
中提供的组。我遵循了Hibernate验证器的源代码,它似乎分别验证了Group对象和两个Person对象。因此,Person验证不会从Group对象级联,并且不会转换验证组。
您是否遇到过类似问题并知道如何解决?
答案 0 :(得分:2)
在JPA触发的生命周期验证期间,Bean Validation使用TraversableResolver
,如果它们标有@Valid
,则不会跟进关联(请参阅3.6.1.2“生命周期事件自动验证的要求) “JPA 2.0规范”。
因此,Person
对象不会通过跟踪来自Group
的引用来验证,但是当它们自己被持久化时,它们将被验证。因此,Group
上声明的群组转化不适用。
您可以通过为Person
定义GroupSequenceProvider来实现所需的行为(请注意,这是Hibernate Validator特定的功能)。为此,您必须将人员的“角色”(例如,具有值Contact
和Manager
的枚举形式)传递给Person
个实例。然后,如果持久存在给定的Person
实例,则默认组序列提供程序可以访问该角色并应用一个或另一个验证组。