【问题标题】:Hibernate Validator for proxied collection代理集合的休眠验证器
【发布时间】:2014-01-23 01:00:03
【问题描述】:

我试图在一个延迟初始化的 OneToMany 集合上使用休眠 @Size 验证。如果我正在创建父实体并在此集合中添加了子实体,则会在尝试持久化时应用验证。 但是,如果我只是找到父实体然后执行 getChildren(),则根本不会应用验证。我什至尝试将注释放在吸气剂上。所以我正在使用@Size(max=1),但即使孩子超过 1 岁,休眠仍然不会引发任何异常。即使 EAGER fetch 也无济于事。 到目前为止,我必须自己将验证逻辑放入 getter 中,但显然这不是干净的方法。请让我知道是否有人以前遇到过这个问题,以及是否有任何优雅的方法可以做到这一点。

【问题讨论】:

    标签: java hibernate jpa bean-validation


    【解决方案1】:

    基于事件的验证在持久化、更新和删除时触发。这些是 JPA 为发生 Bean Validation 定义的事件(有关更多详细信息,请参阅 JSR-317 和 JSR-338 规范)。从数据库加载实体/关联时没有验证。假设是持久化数据已经过验证。如果您需要在您的场景中进行验证,您确实需要手动验证。

    【讨论】:

    • 只是想知道,有没有什么优雅的方法可以在惰性 getter 调用中强加验证?像拦截器或任何其他配置?还是在 getter 本身中添加 java 逻辑是唯一的出路?
    • 我猜拦截器会起作用。这会是什么样子取决于您想使用的技术。您也可以尝试注册 PostCollectionUpdateEventListener。您应该为加载的集合获得一个偶数,此时您可以尝试验证。不过,我仍然对此持怀疑态度,因为没有进一步了解您的用例。
    • 情况很简单,我想强制对子集合施加最大大小限制。就像我做一个 getChildren() 一样,应该有一个验证,没有返回的孩子是
    【解决方案2】:

    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;
        }
    }
    

    【讨论】:

    • 当你说配置 Hibernate 验证器时,配置它是为了什么?初始化延迟加载的集合或通过 if-else 逻辑强制执行自定义验证?
    猜你喜欢
    • 2011-05-17
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多