【问题标题】:Using bean Validation in hibernate在休眠中使用 bean 验证
【发布时间】:2019-01-31 09:18:12
【问题描述】:

我想知道是否可以在 hibernate 中使用 Java Bean Validation,以及它们如何相互集成。

我的数据层中有一个由 Jax-rs API 和 JPA 组成的堆栈。

我想知道它是否可以在不使用 Spring 的情况下使用 Java Bean 验证来验证我的 Hibernate 实体。

我可以将 hibernate 中的注释与 javax.validation.contraints 中的注释一起使用吗

例如:

@Column(nullable = false)
@Size(min =8, max = 12)
@NotNull(message = "Phone Number must be entered")
private String phoneNumber;

这里我指定我的列,通过hibernate和bean验证不能为null。

这是一个好习惯吗?

或者有没有其他方法可以在休眠中验证数据,而不需要像这样的 bean 验证?

【问题讨论】:

    标签: java hibernate javabeans


    【解决方案1】:

    Bean Validation 规范集成了 Hibernate 和 JPA 2.x 规范的所有其他实现。我在我的文章How to automatically validate entities with Hibernate Validator 中详细解释了这一点。

    让我快速总结一下:

    如果您将 Bean Validation 规范的实现(例如 Hibernate Validator)添加到您的项目中,Hibernate 会在插入和更新实体之前自动触发验证。您可以自定义它并在删除实体之前触发验证。我在文章中更详细地解释了这一点。

    您可以使用 Bean 验证规范的所有功能(包括自定义验证规则)来验证您的实体属性。我使用 here 来验证实体属性的值是否在定义的范围内,并使用 here 来检查是否只设置了 2 个关联中的一个。

    您在问题中发布的示例映射是一个非常好的做法! @Column(nullable = false) 部分不是绝对必要的,因为验证规则已经确保属性不能为空。

    【讨论】:

    • 感谢 Thorben 的回答,特别是最后一段。 1- @Basic(optional=false)@Column(nullable = false) 一样吗? 2- 如果我不想使用模式生成工具,它们是否必要? 3- 我应该使用@NotNull 还是对分层模式中的每一层进行验证就足够了?
    【解决方案2】:

    由于 Hibernate 也有自己的验证注解,例如@NotBlank,我认为在这里使用javax.validation.constraint 并不是一个坏习惯。据我所知,Hibernate 甚至尝试考虑所有这些注释。

    例如,在生成的表中,带有@NotNull 注释的字段将不能为空(因此添加nullable = false 是多余的),带有@Size(max=2047) 注释的String 字段将在MySQL 中改为varchar(2047)默认varchar(255)

    这对阅读很有用:http://hibernate.org/validator/

    项目的完整参考文档:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#preface

    编辑:根据 Thorben Janssen 的回答,我下面的原始答案的其余部分可以被丢弃:)

    我不确定是否在数据层自动实施了一些更复杂的约束(例如电话号码的正则表达式)。例如,如果您的phoneNumber 字段有一个@Pattern,那么当您的输入反序列化到您的对象中时,它将起作用。但是,如果您的 setter 方法没有相同的验证约束,您可能会在内存中有一个来自某个来源的对象,该对象的 phoneNumber 格式不正确,可以保存到数据库中。使用这些约束的最安全方法可能包括在数据库保存和更新之前使用Validator.validate() 进行编程验证。

    【讨论】:

      【解决方案3】:

      由于 Hibernate 也有自己的验证注解,例如@NotBlank,我认为在这里使用javax.validation.constraint 并不是一个坏习惯。据我所知,Hibernate 甚至会尝试考虑所有这些注释。

      因此,例如,带有@NotNull 注释的字段在生成的表中将不能为空(因此添加nullable = false 是多余的),带有@Size(max=2047) 注释的String 字段将是varchar(2047) in MySQL 而不是默认的varchar(255)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        相关资源
        最近更新 更多