关于 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_idproject_id!

上的 NOT NULL

这是正常行为,还是我遗漏了什么?

这在@Min javadoc中有解释:

null elements are considered valid.

一个null值是一个未定义的值,@Min你是说,如果定义了值,它必须至少是一些东西。

缺少其他约束,因为 @ManyToOne 默认值为 optional=true,并且在创建 DB 时 JPA 注释优先于 Bean 验证。

这是有道理的,因为有人可能想要验证数据库中没有约束的列。

如果你使用 @ManyToOne(optional=false) 就可以了。