【发布时间】:2020-09-05 18:31:51
【问题描述】:
我被难住了。我正在建立一个新的 Spring Boot 项目。我创建了几个实体类。它能够在数据库中创建一半的表,所以我知道大部分是能够连接到数据库。我已经检查并在配置中设置了方言 - 我正在使用 org.hibernate.dialect.MySQLDialect。 当我尝试运行该问题时,我不断收到如下一组错误:
Caused by: java.sql.SQLSyntaxErrorException: 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 'integer, symbol varchar(5), primary key (id)) engine=InnoDB' at line 1
我尝试检查 google 和其他 stackoverflow 问题均无济于事。大多数情况下,我的发现引导我确保设置了正确的方言,并避免我检查过的保留关键字。
以下是显示的另外两个错误:
Caused by: java.sql.SQLSyntaxErrorException: 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 'integer, primary key (id)) type=MyISAM' at line 1
Caused by: java.sql.SQLSyntaxErrorException: 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 'varchar(255), clock_in varchar(255), clock_out varchar(255), coin varchar(255), ' at line 1
编辑: 这是hibernate正在生成的sql:
Hibernate: create table record (id integer not null, cash varchar(255), check varchar(255), clock_in varchar(255), clock_out varchar(255), coin varchar(255), primary key (id)) type=MyISAM
create table route (id integer not null, name varchar(100), color integer, driver varchar(255), index integer, primary key (id)) type=MyISAM
create table store (id integer not null, name varchar(100), address varchar(255), index integer, symbol varchar(255), primary key (id)) type=MyISAM
编辑 2 - 这是似乎在自动生成表时遇到问题的实体类之一:
package org.tampasa.kettles.models;
import javax.persistence.Entity;
@Entity
public class Store extends AbstractEntity{
private String address;
private String symbol;
private int index;
// Constructors
public Store() {
}
// Getters and Setters
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public Integer getIndex() {
return index;
}
public void setIndex(Integer index) {
this.index = index;
}
}
这里是 AbstractEntity:
package org.tampasa.kettles.models;
import org.hibernate.validator.constraints.Length;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.validation.constraints.NotBlank;
import java.util.Objects;
@MappedSuperclass
public abstract class AbstractEntity {
@Id
@GeneratedValue
private int id;
@NotBlank(message = "Name must not be blank")
@Length(min = 1, max = 100, message = "Name must be between 1 and 100 characters")
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AbstractEntity that = (AbstractEntity) o;
return id == that.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
【问题讨论】:
-
能否请您添加您的sql代码
-
我如何找到它?我尝试将 spring.jpa.show-sql = true 添加到属性中,但在出现错误之前它没有显示任何内容。编辑:我想我找到了。见上文
-
我相信你使用了实体类的自动表生成。你能列出一个你有麻烦的吗?我几乎从未使用过它,但我认为能够看到它会很棒。另外,请您检查一下,您使用的是适合该方言的正确 MySQL 版本吗?根据我的经验,可能会有一些奇怪的差异。至少,有一些带有 Postgres 和 Postgres95 的方言。 :)
-
是的,没错,我正在使用实体类的自动表生成。我现在将编辑原始帖子以显示一个。
-
一个可能的原因可能是未转义
name列。 MS 文档提到它是一个保留字:dev.mysql.com/doc/refman/8.0/en/…。我确定index也不是合法名称。有一个属性强制 Hibernate 启用转义,我去找它。
标签: java mysql hibernate spring-data-jpa