使用GenerationType.AUTO未自动生成MySQL主键,报字段无默认值错误
我编写了如下代码,期望自动生成USER表的主键user_id,但插入数据时出现错误:ERROR 1364 (HY000): Field 'user_id' doesn't have a default value。手动插入BigInt类型值可正常添加数据,但需要实现主键自动生成,请求排查问题原因。
实体类代码
@Entity @Table(name="user") public class User implements Comparable<User>, Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="user_id") private Long id; @Column(name="username", unique=true) private String username; @Column(name="firstname", nullable =false) private String firstname; @Column(name="middlename", nullable =true) private String middlename; @Column(name="lastname", nullable =false) private String lastname; @Column(name="email", nullable = false) private String email; @Column(name="password", nullable =false) private String password; }
持久化配置
<property name="hibernate.dialect" value="com.app.central.dao.pagination.MySQLDialect"/> <property name="hibernate.archive.autodetection" value="class"/> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL57Dialect" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.search.default.directory_provider" value="filesystem"/> <property name="hibernate.search.default.indexBase" value="./lucene/indexes"/> <property name="jboss.as.jpa.providerModule" value="org.hibernate" /> <property name="wildfly.jpa.hibernate.search.module" value="org.hibernate.search.orm" />
表结构说明
user_id字段为BIGINT类型,标记为NOT NULL,但未设置AUTO_INCREMENT属性。
1. 核心问题:数据库表主键未配置自增
Hibernate的@GeneratedValue(strategy=GenerationType.AUTO)依赖数据库层面的主键自增机制,但当前表的user_id没有开启AUTO_INCREMENT,导致插入时数据库无法自动生成主键值,抛出无默认值的错误。
2. 配置冲突:重复设置hibernate.dialect
持久化配置中重复定义了hibernate.dialect属性,先指定自定义方言后又覆盖为官方MySQL57方言,可能导致Hibernate无法正确识别数据库的自增策略。
3. 解决步骤
修正数据库表结构
执行SQL为user_id添加自增属性:ALTER TABLE user MODIFY user_id BIGINT NOT NULL AUTO_INCREMENT;优化实体类注解
对于MySQL,推荐明确指定自增策略,避免GenerationType.AUTO的不确定性,修改主键注解:@Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="user_id", nullable = false, updatable = false) private Long id;GenerationType.IDENTITY会直接适配MySQL的自增机制,稳定性更强。清理持久化配置重复项
删除重复的hibernate.dialect配置,仅保留一个符合需求的方言(若自定义方言无特殊扩展,优先使用官方org.hibernate.dialect.MySQL57Dialect):<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL57Dialect" />注意hbm2ddl.auto的局限性
当前设置hibernate.hbm2ddl.auto=update,该模式仅会新增字段或修改字段基础属性,不会修改已存在主键的自增配置,因此必须手动执行SQL调整表结构,之后Hibernate才能正常生成自增主键。
内容的提问来源于stack exchange,提问作者Sanne112

