用于代理集合的Hibernate Validator

时间:2014-01-23 01:00:03

标签: java hibernate jpa bean-validation

我试图在懒惰初始化的OneToMany集合上使用hibernate @Size验证。如果我正在创建具有此集合中添加的子项的父实体,则会在尝试保留时应用验证。 但是,如果我只是找到父实体然后执行getChildren(),则根本不应用验证。我甚至尝试将注释放在getter上。所以我使用的是@Size(max = 1),但即使孩子超过1,hibernate也不会抛出任何异常。即使EAGER fetch也无济于事。 截至目前,我不得不将验证逻辑放在吸气剂中,但显然这不是干净的方式。如果有人在此之前遇到过这个问题,并且有任何优雅的方式可以做到这一点,请告诉我。

2 个答案:

答案 0 :(得分:1)

Hibernate Validator provides two TraversableResolvers out of the box which will be enabled automatically depending on your environment. The first is DefaultTraversableResolver which will always return true for isReachable() and isTraversable(). The second is JPATraversableResolver which gets enabled when Hibernate Validator is used in combination with JPA 2.

创建自己的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规范)。从数据库加载实体/关联时没有验证。假设持久化数据已经过验证。如果您需要在方案中进行验证,则确实需要手动验证。