在休眠中使用 bean 验证
Using bean Validation in hibernate
我想知道是否可以在休眠中使用 Java Bean Validation,以及它们如何相互集成。
我的数据层中有一个由 Jax-rs API 和 JPA 组成的堆栈。
我想知道我是否可以使用 Java Bean 验证来验证我的 Hibernate 实体,而不使用 Spring.
我可以将 hibernate 中的注释与 javax.validation.contraints
中的注释一起使用
例如:
@Column(nullable = false)
@Size(min =8, max = 12)
@NotNull(message = "Phone Number must be entered")
private String phoneNumber;
这里我指定我的列,不能通过hibernate和bean验证为空。
这是一个好习惯吗?
或者是否有其他方法可以在休眠状态下验证数据,而无需像这样的 bean 验证?
因为 Hibernate 也有自己的验证注释,例如 @NotBlank,我认为在这里使用 javax.validation.constraint
并不是一个坏习惯。据我所知,Hibernate 甚至试图考虑所有这些注释。
例如,用 @NotNull
注释的字段在生成的 table 中不能为空(因此添加 nullable = false
是多余的),用 String
注释的字段@Size(max=2047)
将是 MySQL 中的 varchar(2047)
而不是默认的 varchar(255)
。
这对阅读很有用:http://hibernate.org/validator/
项目的全部参考文档:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#preface
编辑: 根据 Thorben Janssen 的回答,下面我的原始回答的其余部分可以丢弃 :)
我不确定是否在数据层自动强制执行一些更复杂的约束(例如 phone 数字的正则表达式)。例如,如果您的 phoneNumber
字段有一个 @Pattern
,当您的输入被反序列化到您的对象中时,它将起作用。但是,如果您的 setter 方法没有相同的验证约束,您可能在内存中有一个来自某些源的对象,其格式不正确 phoneNumber
可以保存到数据库中。使用这些约束的最安全方法可能包括在数据库保存和更新之前使用 Validator.validate() 进行编程验证。
Bean Validation 规范集成了 Hibernate 和 JPA 2.x 规范的所有其他实现。我在文章 How to automatically validate entities with Hibernate Validator 中对此进行了非常详细的解释。
让我快速总结一下:
如果您将 Bean 验证规范的实现(例如 Hibernate Validator)添加到您的项目,Hibernate 会在插入和更新实体之前自动触发验证。您可以自定义它并在删除实体之前触发验证。我在文章中对此进行了更详细的解释。
您可以使用 Bean 验证规范的所有功能(包括自定义验证规则)来验证您的实体属性。我用 here to validate that the value of an entity attribute is within a defined range and here 检查是否只设置了 2 个关联中的一个。
您在问题中发布的示例映射是一个很好的做法!
@Column(nullable = false)
部分不是绝对必要的,因为验证规则已经确保该属性不能为空。
因为 Hibernate 也有自己的验证注释,例如 @NotBlank
,我认为在这里使用 javax.validation.constraint
并不是一个坏习惯。据我所知,Hibernate 甚至尝试考虑所有这些注释。
因此,例如,用 @NotNull
注释的字段在生成的 table 中不能为空(因此添加 nullable = false
是多余的),String
字段用 @Size(max=2047)
注释的将是 MySQL 中的 varchar(2047)
而不是默认的 varchar(255)
.
我想知道是否可以在休眠中使用 Java Bean Validation,以及它们如何相互集成。
我的数据层中有一个由 Jax-rs API 和 JPA 组成的堆栈。
我想知道我是否可以使用 Java Bean 验证来验证我的 Hibernate 实体,而不使用 Spring.
我可以将 hibernate 中的注释与 javax.validation.contraints
中的注释一起使用
例如:
@Column(nullable = false)
@Size(min =8, max = 12)
@NotNull(message = "Phone Number must be entered")
private String phoneNumber;
这里我指定我的列,不能通过hibernate和bean验证为空。
这是一个好习惯吗?
或者是否有其他方法可以在休眠状态下验证数据,而无需像这样的 bean 验证?
因为 Hibernate 也有自己的验证注释,例如 @NotBlank,我认为在这里使用 javax.validation.constraint
并不是一个坏习惯。据我所知,Hibernate 甚至试图考虑所有这些注释。
例如,用 @NotNull
注释的字段在生成的 table 中不能为空(因此添加 nullable = false
是多余的),用 String
注释的字段@Size(max=2047)
将是 MySQL 中的 varchar(2047)
而不是默认的 varchar(255)
。
这对阅读很有用:http://hibernate.org/validator/
项目的全部参考文档:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#preface
编辑: 根据 Thorben Janssen 的回答,下面我的原始回答的其余部分可以丢弃 :)
我不确定是否在数据层自动强制执行一些更复杂的约束(例如 phone 数字的正则表达式)。例如,如果您的 phoneNumber
字段有一个 @Pattern
,当您的输入被反序列化到您的对象中时,它将起作用。但是,如果您的 setter 方法没有相同的验证约束,您可能在内存中有一个来自某些源的对象,其格式不正确 phoneNumber
可以保存到数据库中。使用这些约束的最安全方法可能包括在数据库保存和更新之前使用 Validator.validate() 进行编程验证。
Bean Validation 规范集成了 Hibernate 和 JPA 2.x 规范的所有其他实现。我在文章 How to automatically validate entities with Hibernate Validator 中对此进行了非常详细的解释。
让我快速总结一下:
如果您将 Bean 验证规范的实现(例如 Hibernate Validator)添加到您的项目,Hibernate 会在插入和更新实体之前自动触发验证。您可以自定义它并在删除实体之前触发验证。我在文章中对此进行了更详细的解释。
您可以使用 Bean 验证规范的所有功能(包括自定义验证规则)来验证您的实体属性。我用 here to validate that the value of an entity attribute is within a defined range and here 检查是否只设置了 2 个关联中的一个。
您在问题中发布的示例映射是一个很好的做法!
@Column(nullable = false)
部分不是绝对必要的,因为验证规则已经确保该属性不能为空。
因为 Hibernate 也有自己的验证注释,例如 @NotBlank
,我认为在这里使用 javax.validation.constraint
并不是一个坏习惯。据我所知,Hibernate 甚至尝试考虑所有这些注释。
因此,例如,用 @NotNull
注释的字段在生成的 table 中不能为空(因此添加 nullable = false
是多余的),String
字段用 @Size(max=2047)
注释的将是 MySQL 中的 varchar(2047)
而不是默认的 varchar(255)
.