web-dev-qa-db-ja.com

org.hibernate.tool.schema.spi.CommandAcceptanceException:h2とJPAを使用するSpringBootでJDBCステートメントを介してDDLを実行するとエラーが発生する

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]

それは1つ以下のために引き起こされます

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を追加しようとしましたが、役に立ちませんでした。

2
shubh

@shubh ..エンティティフィールド名は SQL予約キーワード と一致するので、フィールド名を変更してください。そうでない場合は、@Column Annotationで名前属性を使用してください(これにより、データベースにエイリアス名が与えられます)。

    @Column(name="valueFrom") 
    private String from;

    @Column(name="valueTo") 
    private String to;

    private BigDecimal conversionMultiple;
    private int port;
2
ganesh045

からのエンティティフィールド名が、データベースで予約されているWord fromと一致したか、フィールド名を別のフィールド名に変更したか、そのフィールドに@Columnアノテーションを追加しました。お気に入り:

...

@Column(name = "_from")
private String from;

...

私は同じ問題に直面しました。 mysqlデータベースでスキーマ名を指定する際に間違いを犯しました。

In spring.properties -> (spring boot application)
spring.datasource.url=jdbc:mysql://localhost:3306/db_microservice

ここでは「db_microservice」の代わりに「db-microservice」という名前を付けました。したがって、「-」は使用しないでください。そして、これは私の問題を解決しました。

0

hibernateのテーブル作成クエリは次のように機能するため、@ ganesh045の応答は実際にはtrueではありません。たとえば、各属性に対してCREATE TABLE <your_table> 'password'を使用します。属性に ``を追加すると、SQLはそれをNOTを予約キーワードとして読み取ります。 JpaRepository内の選択句をクエリする場合も同じです。次のような呼び出しを行います:SELECT 'attribute' FROM <your_table>。問題は、スキーマ名をkebab-caseまたはcamelCaseおよびsnake_case以外のものとして指定した可能性があります。また、このアプローチを使用すると、属性のusernameおよびpasswordを実際にMYSQL reserved keywordsに持つUserというテーブルを作成できます。

0
Subbre