关于 Hibernate bean 验证
About Hibernate bean validation
我已将休眠验证器添加到我的项目中,并用相关约束注释了我的 class。这是我的 pom.xml:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-validator</artifactId>
</dependency>
这是注释 class:
public class EmployeeProject extends PanacheEntity {
@NotNull
@ManyToOne
private Employee employee;
@NotNull
@ManyToOne
private Project project;
@Column
@Min(value = 1)
private int quantity;
}
当我尝试通过 Java 代码保留无效的 bean - null employee/project and/or 非正数时,如预期的那样引发了验证异常。
但是,当我尝试将无效的元组直接保存到数据库中时,令人惊讶的是没有引发异常或数据库错误。事实上,原因是 Hibernate 自动生成的 employee_project
没有验证约束——只有两个外键约束。我知道没有简单的方法可以将 @Min
翻译成 SQL,但是我至少期待 employee_id
和 project_id
!
上的 NOT NULL
这是正常行为,还是我遗漏了什么?
这在@Min
javadoc中有解释:
null elements are considered valid.
一个null
值是一个未定义的值,@Min
你是说,如果定义了值,它必须至少是一些东西。
缺少其他约束,因为 @ManyToOne
默认值为 optional=true
,并且在创建 DB 时 JPA 注释优先于 Bean 验证。
这是有道理的,因为有人可能想要验证数据库中没有约束的列。
如果你使用 @ManyToOne(optional=false)
就可以了。
我已将休眠验证器添加到我的项目中,并用相关约束注释了我的 class。这是我的 pom.xml:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-validator</artifactId>
</dependency>
这是注释 class:
public class EmployeeProject extends PanacheEntity {
@NotNull
@ManyToOne
private Employee employee;
@NotNull
@ManyToOne
private Project project;
@Column
@Min(value = 1)
private int quantity;
}
当我尝试通过 Java 代码保留无效的 bean - null employee/project and/or 非正数时,如预期的那样引发了验证异常。
但是,当我尝试将无效的元组直接保存到数据库中时,令人惊讶的是没有引发异常或数据库错误。事实上,原因是 Hibernate 自动生成的 employee_project
没有验证约束——只有两个外键约束。我知道没有简单的方法可以将 @Min
翻译成 SQL,但是我至少期待 employee_id
和 project_id
!
这是正常行为,还是我遗漏了什么?
这在@Min
javadoc中有解释:
null elements are considered valid.
一个null
值是一个未定义的值,@Min
你是说,如果定义了值,它必须至少是一些东西。
缺少其他约束,因为 @ManyToOne
默认值为 optional=true
,并且在创建 DB 时 JPA 注释优先于 Bean 验证。
这是有道理的,因为有人可能想要验证数据库中没有约束的列。
如果你使用 @ManyToOne(optional=false)
就可以了。