为何Java Entity字段的javax.validation.constraints未被Hibernate映射到数据库Schema?
问题:JSR380校验注解未生成数据库Schema约束
我使用Spring Boot 2.7.11开发应用,Hibernate自动创建数据库Schema的功能正常,但javax.validation.constraints包下的校验注解(如@NotNull、@Size)并未生成对应的数据库约束(非空限制、长度限制),连接数据库后看不到Person类中text字段的预期约束。
我的配置信息
Gradle构建文件
plugins { id("java") id("war") id("org.springframework.boot") version "2.7.11" } group = "org.example" version = "1.0-SNAPSHOT" repositories { mavenCentral() } dependencies { implementation ("org.springframework.boot:spring-boot-starter-data-jpa:2.7.11") implementation("org.postgresql:postgresql:42.6.0") implementation("javax.xml.bind:jaxb-api:2.3.0") implementation("javax.validation:validation-api:2.0.1.Final") implementation("org.hibernate.validator:hibernate-validator:6.0.1.Final") }
Entity类
import javax.persistence.*; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "id", nullable = false) private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Size(max = 10) @NotNull public String text; }
application.properties配置
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL95Dialect spring.jpa.hibernate.ddl-auto=create spring.datasource.username=postgres spring.datasource.password=password
原因及解决办法
核心原因
Hibernate默认不会自动将JSR380的校验注解转换为数据库DDL约束,需要手动开启对应配置;另外,Entity类中text字段为公共字段,虽不影响注解识别,但不符合JavaBean规范,建议调整。
解决步骤
- 开启Hibernate校验注解转DDL的配置
在application.properties中添加以下配置:
# 让Hibernate将JSR380校验注解映射为数据库约束 spring.jpa.properties.hibernate.validator.apply_to_ddl=true
- 修正Entity类的字段访问方式(推荐)
将text字段改为私有,并添加getter/setter方法,确保注解能被Hibernate正确识别(符合JavaBean规范):
import javax.persistence.*; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "id", nullable = false) private Long id; @Size(max = 10) @NotNull @Column(name = "text") // 可显式指定列名,可选 private String text; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } }
- 重启应用验证
重启Spring Boot应用后,Hibernate会重新生成Schema,此时text字段会带有NOT NULL约束,且长度限制为10(对应PostgreSQL的varchar(10))。
内容的提问来源于stack exchange,提问作者bobbyrne01
相关产品推荐
相关产品推荐

