Hibernate操作MariaDB时字段已设默认值仍报cannot be null错误
根本原因
- 数据库默认值生效规则限制:数据库字段的默认值仅在
INSERT语句未显式指定该字段,或显式使用DEFAULT关键字赋值时才会触发。你贴出的Hibernate执行日志里的插入语句insert into user2 (active, role, user_id) values (?, ?, ?)已经明确包含了role字段,且因为实体中该字段未赋值为null,等于主动给role传了null值,直接触发非空约束报错,默认值不会生效。 @Column配置的作用边界:你写的@Column(nullable = false, columnDefinition = "varchar(16) default 'USER'")里的默认值配置,仅在Hibernate自动建表阶段生效,只会在生成CREATE TABLE语句时给字段加默认值规则,完全不会影响Hibernate运行时生成INSERT语句的逻辑,也不会自动给实体字段赋值。
解决方案原理
@PrePersist方案:该注解是JPA提供的实体生命周期回调注解,标注的方法会在实体执行INSERT持久化操作前自动触发,提前给role字段赋值为USER,此时Hibernate读取到的字段值非空,插入时传入的参数就是合法值,不会触发非空报错。- 替代方案:你也可以给实体类添加
@DynamicInsert注解,开启后Hibernate生成INSERT语句时会自动忽略值为null的字段,此时role字段不会出现在插入语句中,数据库就会自动应用预设的默认值,同样可以解决问题。
内容的提问来源于stack exchange,提问作者AZetZ
相关产品推荐
相关产品推荐

