SpringBoot连接MySQL遇CommandAcceptanceException报错求助
问题:SpringBoot连接MySQL时出现CommandAcceptanceException错误
尝试将MySQL数据库连接到Java SpringBoot项目,出现org.hibernate.tool.schema.spi.CommandAcceptanceException错误,修改spring.jpa.hibernate.ddl-auto=update(实际未变更配置)后问题仍未解决。
错误详情
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table to_do (id integer not null, desc varchar(255), done bit not null, target_date date, username varchar(255), primary key (id)) engine=InnoDB" via JDBC [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc varchar(255), done bit not null, target_date date, username varchar(255), p' at line 1]
配置文件
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp logging.level.org.springframework=info logging.level.com.pao.springboot.myFirstWebApp=debug spring.jpa.defer-datasource-initialization=true spring.datasource.url=jdbc:mysql://localhost:3306/todos spring.datasource.username=todos-user spring.datasource.password=dummytodos spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency>--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>glassfish-jstl</artifactId> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>5.1.3</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap-datepicker</artifactId> <version>1.9.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
实体类
package com.pao.springboot.myFirstWebApp.toDo; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import java.time.LocalDate; //Database // List of todos @Entity(name = "ToDo") public class toDo { @Id @GeneratedValue private int id; private String username; private String desc; private LocalDate targetDate; private boolean done; public toDo(){} public toDo(int id, String username, String desc, LocalDate targetDate, boolean done) { this.id = id; this.username = username; this.desc = desc; this.targetDate = targetDate; this.done = done; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public LocalDate getTargetDate() { return targetDate; } public void setTargetDate(LocalDate targetDate) { this.targetDate = targetDate; } public boolean isDone() { return done; } public void setDone(boolean done) { this.done = done; } @Override public String toString() { return "toDo{" + "id=" + id + ", user='" + username + '\'' + ", desc='" + desc + '\'' + ", targetDate=" + targetDate + ", done=" + done + '}'; } }
解决方案
- 核心原因:实体类中的
desc字段是MySQL的保留关键字,直接作为列名会触发SQL语法错误。 - 解决方法二选一:
- 修改字段名,避免使用关键字:
将实体类中的desc改为description,同步更新对应的getter/setter方法:private String description; public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } - 保留原字段名,通过注解转义关键字:
在desc字段上添加@Column注解,用反引号包裹列名:import jakarta.persistence.Column; // ...其他代码 @Column(name = "`desc`") private String desc;
- 修改字段名,避免使用关键字:
- 额外建议:确认MySQL版本与驱动版本兼容,当前使用的mysql-connector-java 8.0.13适配MySQL 8.x版本,若版本不匹配可能引发其他异常。
内容的提问来源于stack exchange,提问作者Pao Beltran
相关产品推荐
相关产品推荐

