Spring Boot Starter Validation搭配PostgreSQL时DDL执行失败问题
问题分析与解决
错误根源
问题核心在于:Usuarios类里的imagen字段是String类型,但你给它加了@Min(1)和@Max(7)注解。Hibernate会把这两个数值校验注解转换成数据库的CHECK约束,生成check (imagen>=1 AND imagen<=7)这样的DDL语句。
PostgreSQL对类型一致性要求严格,不允许直接拿字符串(character varying)和整数做比较,所以报错。而H2数据库类型转换比较宽松,自动帮你做了类型转换,所以之前没暴露这个问题。
解决方案
根据业务需求,有两种处理方式:
方式一:把字段改成数值类型(推荐,符合语义)
如果imagen本来就是用来存储1-7的数字,直接把字段类型从String改成Integer,保留@Min和@Max注解:
@NotNull @Min(1) @Max(7) @Column(nullable=false) private Integer imagen;
这样生成的CHECK约束是整数之间的比较,PostgreSQL能正常执行DDL创建表。
方式二:保留String类型,改用正则校验
如果必须用String类型存储(比如存的是"1"到"7"的字符串),就不能用@Min/@Max,换成@Pattern注解做正则验证:
@NotNull @Pattern(regexp = "^[1-7]$") @Column(nullable=false) private String imagen;
这个正则会限制字符串只能是1到7的单个字符,同时Hibernate不会生成错误的CHECK约束,避免数据库报错。
内容的提问来源于stack exchange,提问作者Adonis Becerra Morales
相关产品推荐
相关产品推荐

