微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于 Hibernate bean 验证

如何解决关于 Hibernate bean 验证

我已将 hibernate 验证器添加到我的项目中,并使用相关约束注释了我的类。这是我的 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>

这是带注释的类:

public class EmployeeProject extends PanacheEntity {

    @NotNull
    @ManyToOne
    private Employee employee;

    @NotNull
    @ManyToOne
    private Project project;

    @Column
    @Min(value = 1)
    private int quantity;

}

当我尝试通过 Java 代码持久化无效 bean(空员工/项目和/或非正数)时,会按预期引发验证异常。

然而,当我尝试将一个无效的元组直接持久化到数据库中时,令人惊讶的是没有引发异常或数据库错误。事实上,原因是 Hibernate 自动生成employee_project 没有验证约束——只有两个外键约束。我知道没有简单的方法可以在 sql 中翻译 @Min,但是男孩,我至少期待在 employee_idproject_id 上有一个 NOT NULL!

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

解决方法

这在 @Min javadoc 中有解释:

null elements are considered valid.

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

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

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

如果您使用 @ManyToOne(optional=false),它会起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。