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

使用GenerationType.AUTO未自动生成MySQL主键,报字段无默认值错误

问题:USER表主键user_id无法自动生成,插入时报错ERROR 1364

我编写了如下代码,期望自动生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:55:06