我试图在懒惰初始化的OneToMany集合上使用hibernate @Size验证。如果我正在创建具有此集合中添加的子项的父实体,则会在尝试保留时应用验证。 但是,如果我只是找到父实体然后执行getChildren(),则根本不应用验证。我甚至尝试将注释放在getter上。所以我使用的是@Size(max = 1),但即使孩子超过1,hibernate也不会抛出任何异常。即使EAGER fetch也无济于事。 截至目前,我不得不将验证逻辑放在吸气剂中,但显然这不是干净的方式。如果有人在此之前遇到过这个问题,并且有任何优雅的方式可以做到这一点,请告诉我。
答案 0 :(得分:1)
创建自己的TraversableResolver
实现或使用DefaultTraversableResolver
并配置Hibernate Validator。
public class MyTraversableResolver implements TraversableResolver {
@Override
public boolean isReachable(
Object traversableObject,
Node traversableProperty,
Class<?> rootBeanType,
Path pathToTraversableObject,
ElementType elementType) {
return true;
}
@Override
public boolean isCascadable(
Object traversableObject,
Node traversableProperty,
Class<?> rootBeanType,
Path pathToTraversableObject,
ElementType elementType) {
return true;
}
}
答案 1 :(得分:1)
基于事件的验证在持久,更新和删除时触发。这些是JPA为Bean Validation定义的事件(有关更多详细信息,请参阅JSR-317和JSR-338规范)。从数据库加载实体/关联时没有验证。假设持久化数据已经过验证。如果您需要在方案中进行验证,则确实需要手动验证。