You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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规范,建议调整。

解决步骤

  1. 开启Hibernate校验注解转DDL的配置
    在application.properties中添加以下配置:
# 让Hibernate将JSR380校验注解映射为数据库约束
spring.jpa.properties.hibernate.validator.apply_to_ddl=true
  1. 修正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;
    }
}
  1. 重启应用验证
    重启Spring Boot应用后,Hibernate会重新生成Schema,此时text字段会带有NOT NULL约束,且长度限制为10(对应PostgreSQL的varchar(10))。

内容的提问来源于stack exchange,提问作者bobbyrne01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:02:27