在休眠中使用bean验证

时间:2019-01-31 09:18:12

标签: java hibernate javabeans

我想知道是否可以在休眠模式下使用Java Bean验证,以及它们如何相互集成。

我在我的数据层中有一个包含Jax-rs API和JPA的堆栈。

我想知道是否可以使用Java Bean验证而不使用Spring来验证我的Hibernate实体。

我可以将休眠的注释与javax.validation.contraints的注释一起使用

例如:

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

在这里我指定列,通过休眠和bean验证不能为空。

这是一个好习惯吗?

或者有没有一种方法可以在休眠状态下验证数据,而无需像这样的bean验证?

2 个答案:

答案 0 :(得分:2)

在Bean验证规范集成了休眠和JPA 2.x的规范的所有其他实施方式。我在我的文章解释说,在伟大的详细How to automatically validate entities with Hibernate Validator

让我简要介绍一下

如果您添加Bean验证规范,例如的实现,Hibernate验证,您的项目时,Hibernate会自动触发插入和更新的实体之前验证。您可以自定义它,还可以在删除实体之前触发验证。我在文章中对此进行了详细解释。

您可以使用Bean验证规范的所有功能,包括自定义的验证规则,来验证你的实体属性。我用here来验证实体属性的值是一个限定的范围内和here来检查的2个协会中只有一个是集。

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

答案 1 :(得分:1)

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

例如,用@NotNull注释的字段在生成的表中将不能为空(因此添加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的答案,我原来在此下方的答案的其余部分可被丢弃:)

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