我应该依赖数据库进行Hibernate属性验证吗?

时间:2013-07-15 16:47:57

标签: java hibernate jpa bean-validation

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

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

例如,请考虑以下实体:

public class Registry {

    @NotNull
    String userName;

    @NotNull
    Date createdAt;
}

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

因此,我通常将此对象绑定到页面上的表单,并使用@Valid执行JSR-303验证。但问题是:我没有通过Bean Validation验证“createdAt”,我希望只有在Hibernate持久保存实体时才能验证它。但是,使用Bean Validation,两个属性都会在表单请求中得到验证。

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

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

1 个答案:

答案 0 :(得分:1)

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

@interface PrePersist {}

public class Registry {

    @NotNull
    String userName;

    @NotNull(groups = PrePersist.class)
    Date createdAt;
}

在persistence.xml中指定要在预先保留期间使用的组:

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