web-dev-qa-db-fra.com

org.hibernate.tool.schema.spi.CommandAcceptanceException: erreur lors de l'exécution de DDL via l'instruction JDBC dans SpringBoot avec h2 et JPA

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é.

2
shubh

@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;
2
ganesh045

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;

...

0

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.

0
S Debasish Nayak

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.

0
Subbre