【问题标题】:Should I rely on database for Hibernate attributes validation?我应该依赖数据库进行 Hibernate 属性验证吗?
【发布时间】:2013-07-15 16:47:57
【问题描述】:

JEE6 教程 (http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html) 建议应该使用 JSR-303 / Bean Validation 来验证输入 - 或者至少这是我对它的解释。

尽管如此,一些 Bean 验证注释,例如 @NotNull 可能在接口验证级别没有用,但在预持久级别。

例如,考虑以下实体:

public class Registry {

    @NotNull
    String userName;

    @NotNull
    Date createdAt;
}

在这种情况下,有一个用户名由用户自己填写的表单。但我不希望用户知道该注册表的创建日期。我希望我的后端将其设置为服务器的当前日期。

所以,我通常会将此对象绑定到页面上的表单,并使用@Valid 执行 JSR-303 验证。但问题是:我不“createdAt”由 Bean Validation 验证,我希望它仅在实体将由 Hibernate 持久化时进行验证。但是,使用 Bean Validation,两个属性都会在表单请求时得到验证。

如何解决这个问题? JSR-303 应该在这种情况下工作吗?我是否应该依赖“createdAt”属性的数据库可为空字段验证?

这篇文章几乎是关于同一个问题,但我也没有找到任何答案:Validation where to organize in web app for more efficient way

【问题讨论】:

    标签: java hibernate jpa bean-validation


    【解决方案1】:

    将您的约束分配给不同的validation groups,并在提交表单时验证一个组(例如默认组),另一个在预存时验证(例如验证组PrePersist

    @interface PrePersist {}
    
    public class Registry {
    
        @NotNull
        String userName;
    
        @NotNull(groups = PrePersist.class)
        Date createdAt;
    }
    

    在您的 persistence.xml 中指定要在 pre-persist 期间使用的组:

    <persistence ...>
        <persistence-unit ...>
            ...
            <properties>
                <property
                    name="javax.persistence.validation.group.pre-persist" 
                    value="com.example.PrePersist"/>
            </properties>
        </persistence-unit>
    </persistence>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多