使用h2数据库和JPA运行spring boot时,我遇到了以下错误。
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:440) [hibernate-core-5.2.17.Final.jar:5.2.17.Final]
这是由于以下原因引起的
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "CREATE TABLE EXCHANGE_VALUE (ID INTEGER NOT NULL, CONVERSION_MULTIPLE DECIMAL(19,2), FROM[*] VARCHAR(255), PORT INTEGER NOT NULL, TO VARCHAR(255), PRIMARY KEY (ID)) "; expected "identifier"; SQL statement:
create table exchange_value (id integer not null, conversion_multiple decimal(19,2), from varchar(255), port integer not null, to varchar(255), primary key (id)) [42001-197]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:357) ~[h2-1.4.197.jar:1.4.197]
at org.h2.message.DbException.getSyntaxError(DbException.java:217) ~[h2-1.4.197.jar:1.4.197]
我的休眠类
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="Exchange_Value")
public class ExchangeValue {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String from;
private String to;
private BigDecimal conversionMultiple;
private int port;
public ExchangeValue() {
}
public ExchangeValue(String from, String to, BigDecimal conversionMultiple) {
super();
// this.id = id;
this.from = from;
this.to = to;
this.conversionMultiple = conversionMultiple;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
application.properties在下面
spring.application.name=currency-exchange-service
server.port=8000
spring.jpa.hibernate.ddl-auto= create-drop
只想知道我在代码中缺少的内容,尝试添加spring.jpa.hibernate.ddl-auto = create-drop,但没有帮助。
答案 0 :(得分:4)
@shubh ..您的实体字段名称与SQL reserved keywords匹配,因此,请尝试更改字段名称,否则请使用名称属性与@Column Annotation
(为数据库提供别名)
@Column(name="valueFrom")
private String from;
@Column(name="valueTo")
private String to;
private BigDecimal conversionMultiple;
private int port;
答案 1 :(得分:0)
“您的实体字段名称”来自与数据库保留字来自“”, 将字段名称更改为另一个,或在该字段上添加@Column批注。 喜欢:
...
@Column(name = "_from")
private String from;
...
答案 2 :(得分:0)
我遇到了同样的问题。我在mysql数据库中指定架构名称时犯了错误。
In spring.properties -> (spring boot application)
spring.datasource.url=jdbc:mysql://localhost:3306/db_microservice
在这里,我将其名称改为“ db-microservice”,而不是“ db_microservice”。因此,请勿使用“-”。这解决了我的问题。
答案 3 :(得分:0)
@ ganesh045的响应实际上并不正确,因为hibernate的表创建查询的工作方式如下:CREATE TABLE <your_table> 'password'
例如针对您的每个属性。在属性中添加``将使SQL读取NOT
作为保留关键字。在JpaRepository中查询您的select子句时,它也执行相同的操作。它将发出如下呼叫:SELECT 'attribute' FROM <your_table>
。您的问题很可能是您将架构名称指定为kebab-case或任何非camelCase和snake_case的名称。此外,使用这种方法,您可以创建一个名为User的表,该表的属性为username
和password
,实际上也都是MYSQL reserved keywords
。