Lors de l'exécution de Spring Boot avec la base de données H2 et JPA, j'obtiens une erreur inférieure.
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]
Elle est due à moins d'un
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]
Ma classe d'hibernation
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 est ci-dessous
spring.application.name=currency-exchange-service
server.port=8000
spring.jpa.hibernate.ddl-auto= create-drop
Je veux juste savoir ce que je manque dans le code, j'ai essayé d'ajouter spring.jpa.hibernate.ddl-auto = create-drop mais cela n'a pas aidé.
@shubh .. Les noms de vos champs d'entité correspondent à mots clés réservés SQL , essayez donc de modifier les noms de champs, sinon utilisez l'attribut name avec @Column Annotation
(qui donne des noms d'alias à la BASE DE DONNÉES)
@Column(name="valueFrom")
private String from;
@Column(name="valueTo")
private String to;
private BigDecimal conversionMultiple;
private int port;
Le nom de votre champ d'entité de a été mis en correspondance avec la base de données réservée Word de, changez le nom du champ en un autre ou ajoutez une annotation @Column sur ce champ. Comme:
...
@Column(name = "_from")
private String from;
...
J'ai fait face au même problème. J'ai fait l'erreur en donnant le nom du schéma dans la base de données mysql.
In spring.properties -> (spring boot application)
spring.datasource.url=jdbc:mysql://localhost:3306/db_microservice
Ici, au lieu de "db_microservice", j'ai donné le nom de "db-microservice". N'utilisez donc pas "-". Et cela a résolu mon problème.
La réponse de @ ganesh045 n'est pas réellement vraie car la requête de création de table de hibernate fonctionne comme ceci: CREATE TABLE <your_table> 'password'
par exemple pour chacun de vos attributs. L'ajout du `` à l'attribut fera que SQL le lira NOT
comme mot clé réservé. Il fait également la même chose lorsqu'il interroge vos clauses select dans JpaRepository. Il fera un appel comme celui-ci: SELECT 'attribute' FROM <your_table>
. Votre problème est très probablement que vous avez spécifié votre nom de schéma comme kebab-case ou tout ce qui n'est pas camelCase et snake_case. De plus, avec cette approche, vous pouvez avoir une table appelée Utilisateur avec l'attribut username
et password
qui sont en fait également MYSQL reserved keywords
.