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. 额外验证步骤
- 确保MySQL中
student表结构和修正后的实体类匹配:包含id(BIGINT类型、自增、主键)、sname、email、key1字段。 - 检查表单提交逻辑,确保表单字段名和实体类属性名(或
@Column指定的列名)一致,避免数据绑定失败。 - 启动应用后查看控制台日志,确认无SQL语法错误,再提交表单测试数据插入。
这样修改后,就能解决表被删除的问题,同时实现数据正常插入MySQL表的需求了。
内容的提问来源于stack exchange,提问作者Jigar
相关产品推荐
相关产品推荐

