gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:03:36 25 4
gpt4 key购买 nike

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

在Entity字段(列)上,我定义了很多Constraints(比如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>

最佳答案

你在混合东西。

Bean 验证

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

您可以使用 Validator验证您的 bean 并获得 javax.validation.ConstraintViolationException所有ConstraintViolation与属性(property)的信息。

JPA/Hibernate 支持 Bean Validation应用程序接口(interface)。如果<validation-mode> persistence.xml 中的元素设置为 AUTO (或者未设置,因为 AUTO 是默认值),JPA 将在使用 Validator 保存实体之前验证它们, 然后抛出 javax.validation.ConstraintViolationException如果有ConstraintViolation s,仅当 Bean Validation 的实现时存在于环境中。如果你设置 <validation-mode>CALLBACK ,JPA 将始终验证实体,如果没有 Bean Validation,将在部署期间抛出错误对环境的实现。

SQL 约束

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

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

结论

  • 设置<validation-mode>CALLBACK在你的 persistence.xml确保始终执行验证并且无效值不会进入数据库
  • 使用 javax.validation.constraints用于处理 SQL 列约束的注释,例如,最大大小为 50 的非空列:

    @NotNull @Size(最大值 = 50)@Column(name = "NAME", nullable = false, length = 50)

  • 为唯一约束和外键约束提供有意义的名称,因为这将是您可以获得的唯一信息,用于确定违反了哪些约束。

关于java - Hibernate - 有没有办法获取违反约束的列的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61555717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com