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

Spring Boot JPA插入MySQL数据遇SQL语法错误,提交表单后表自动删除

解决Spring Boot JPA CRUD中的表自动删除与SQLGrammarException问题

你遇到的问题本质是两个核心错误导致的:实体类主键配置逻辑错误,以及JPA自动建表策略配置不当,我来一步步帮你修复:

1. 修正实体类的主键配置(解决SQLGrammarException的核心)

你的Student实体类犯了典型的JPA主键配置错误:

  • 你把@Id标注在了String类型的sname字段上,同时使用GenerationType.AUTO生成策略。AUTO策略仅适用于数值类型主键(比如Long/Integer),Hibernate会尝试生成自增主键,但String类型无法支持这种逻辑,直接导致SQL语法错误,无法提取结果集。
  • 另外,sname作为姓名字段不适合做主键(可能存在重复值),主键应该是唯一、稳定的标识字段,比如自增ID。

修正后的实体类代码

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.GenerationType;

@Entity
@Table(name="student")
public class Student {
    // 新增自增主键ID,作为唯一标识
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY) // 适配MySQL自增主键逻辑
    @Column(name="id")
    private Long id;

    @Column(name="sname")
    private String sname;

    @Column(name="email")
    private String email;

    @Column(name="key1")
    private String key1;

    // 必须添加getter和setter方法!JPA依赖这些方法访问字段
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getSname() { return sname; }
    public void setSname(String sname) { this.sname = sname; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    public String getKey1() { return key1; }
    public void setKey1(String key1) { this.key1 = key1; }
}

2. 调整JPA自动建表策略(解决表被自动删除的问题)

你的MySQL表被自动删除,大概率是application.properties(或application.yml)中的spring.jpa.hibernate.ddl-auto配置错误:

  • 如果设置为create:每次启动应用时,Hibernate会删除原有表并重建。
  • 如果设置为create-drop:启动时建表,关闭应用时自动删表。

正确配置建议

根据你的需求(保留表结构并插入数据),修改为:

# application.properties
spring.jpa.hibernate.ddl-auto=update
  • update:Hibernate会根据实体类结构更新表,不会删除已有表和数据,仅新增字段或兼容修改字段类型。
  • 若你已经手动创建好表,也可以设置为none,完全禁用Hibernate的自动DDL操作。

3. 额外验证步骤

  1. 确保MySQL中student表结构和修正后的实体类匹配:包含id(BIGINT类型、自增、主键)、sname、email、key1字段。
  2. 检查表单提交逻辑,确保表单字段名和实体类属性名(或@Column指定的列名)一致,避免数据绑定失败。
  3. 启动应用后查看控制台日志,确认无SQL语法错误,再提交表单测试数据插入。

这样修改后,就能解决表被删除的问题,同时实现数据正常插入MySQL表的需求了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:23:04