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)
你正在混合东西。
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)
为唯一约束和外键约束提供有意义的名称,因为这将是您可以获得的识别违反约束的唯一信息。
| 归档时间: |
|
| 查看次数: |
2734 次 |
| 最近记录: |