Hibernate - 有没有办法获取违反约束的列的名称?

wei*_*ble 5 java hibernate maven spring-boot

我正在使用 Hibernate 将实体保存在数据库中。

在实体字段(列)上,我定义了很多约束(例如NotNull或length=10)。当违反 Constraint 时,会抛出 ConstraintViolationException。我希望能够以某种方式跟踪哪一列违反了约束。Java库“javax.validation.ConstraintViolation”中的ConstraintViolationException有一个方法“getConstraintViolations()”,所以我可以这样做

constraintViolationException.getConstraintViolations().getPropertyPath()

这应该给我列名。

然而,Hibernate 抛出的 ConstraintViolationException 没有方法“getConstraintViolations()”,而且似乎也没有类似的方法。我现在唯一的选择是分析通过调用“getConstraintName()”返回的字符串:

constraintViolationException.getConstraintName()

但这看起来有点混乱而且不安全。

有谁知道如何获取列名称?

编辑:

pom.xml内的相关依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

are*_*eus 3

你正在混合东西。

Bean 验证

Bean ValidationAPI 允许您使用@NotNull@Size以及包的所有其他注释来验证您的 bean javax.validation.constraints

您可以使用 aValidator来验证您的 bean 并获取javax.validation.ConstraintViolationException包含所有ConstraintViolation属性信息的 a 。

JPA/Hibernate 支持Bean ValidationAPI。如果<validation-mode>中 的元素persistence.xml设置为AUTO(或者未设置,如AUTO默认值),JPA 将在使用 a 保存实体之前验证它们,并且仅当环境中存在的实现时,如果存在任何s,则Validator抛出 a 。如果设置为,JPA 将始终验证实体,并且如果环境中没有实现,则会在部署期间引发错误。javax.validation.ConstraintViolationExceptionConstraintViolationBean Validation<validation-mode>CALLBACKBean Validation

SQL 约束

JPA 注释,例如@Column提供生成数据库 DDL 的信息。使用@Column(nullable = false, length = 10)将生成最大长度为 10 的数据库列和NOT NULLSQL 约束。但仅此而已。Hibernate 在将语句发送到数据库之前不会检查此项。

如果提供了值,数据库将报告 SQL 错误,该错误将由JDBC 驱动程序null映射到。SQLException对于每个 DBMS,错误消息SQLException会有所不同,但会包含约束名称。Hibernate 将此异常包装在org.hibernate.exception.ConstraintViolationException从 SQLException 消息中提取约束名称的 a 中。

结论

  • 设置<validation-mode>CALLBACKonpersistence.xml以确保始终执行验证并且无效值不会到达数据库
  • 使用javax.validation.constraints注释来匹配 SQL 列约束,例如最大大小为 50 的非空列:

    @NotNull @Size(max = 50) @Column(name = "NAME", nullable = false, length = 50)

  • 为唯一约束和外键约束提供有意义的名称,因为这将是您可以获得的识别违反约束的唯一信息。