2017-09-22 3 views
0

Oracleデータベース(12c)が本番環境で使用され、HSQLDB(メモリ内)がテストケースで使用される設定があります。私はデータベースを更新するためにLiquibaseを使用します。HSQLDBでJPA2を使用した自動ID生成に関する問題

@Entity 
@Table(name = "SYSTEM") 
public class System { 

    @ApiModelProperty(hidden = true) 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID", columnDefinition = "BIGINT") 
    private Long id; 

    @NotNull 
    @Size(max = 40) 
    @Column(name = "NAME", columnDefinition = "NVARCHAR2") 
    private String name; 

    @Size(max = 16) 
    @GeneratedValue 
    @Column(name = "TOKEN", columnDefinition = "VARBINARY") 
    private UUID token; 
} 

私は、この表で使用LiquiBaseを定義は次のとおりです:

は、私は、次のクラスを持っている

"createTable": { 
    "tableName": "SYSTEM", 
    "columns": [ 
     { 
      "column": { 
       "name": "ID", 
       "type": "BIGINT", 
       "autoIncrement": true, 
       "constraints": { 
        "primaryKey": true 
       } 
      } 
     }, 
     { 
      "column": { 
       "name": "NAME", 
       "type": "VARCHAR2(40)", 
       "constraints": { 
        "nullable": false 
       } 
      } 
     }, 
     { 
      "column": { 
       "name": "TOKEN", 
       "type": "RAW(16)", 
       "constraints": { 
        "nullable": false 
       } 
      } 
     } 
    ] 
} 

Oracleデータベース上でこの作品をEntityManager.persistを使用して新しいシステムを作成します。行がデータベースに挿入され、IDフィールドに期待どおりの値が入力されます。

HSQLDBデータベースではこれは起こりません。そして、私には、自動生成がトリガーされていないように見えます。システムテーブルを作成するために、HSQLDBによって実行

SQLは次のとおりです。

CREATE TABLE PUBLIC."SYSTEM" (ID BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, NAME VARCHAR2(40) NOT NULL, TOKEN RAW(16) NOT NULL, CONSTRAINT PK_SYSTEM PRIMARY KEY (ID)) 

HSQLDBにおける既知のバグがありますか私が何か間違ったことをやっていますか?

+0

バグがあれば、_h2データベース_が代わりになります - w.r.t. Liquibase。オラクルの互換モードもあります。 –

+0

バグか解決策が見つからない場合はh2を試してみます。提案していただきありがとうございます。 – jkc

答えて

0

;sql.syntax_ora=trueをJDBC接続URLの末尾に追加する必要があります。

メモリ内のデータベースでは、同じJavaプロセスを使用してデータベースを更新し、クエリを実行する必要があります。 2つの別々のプロセスが使用されている場合、プロセスが終了すると、最初のプロセスによって作成されたデータベースは消えます。

+0

'; sql.syntax_ora = true'は接続URLにあり、変更されないように、私は恐れています。しかし、あなたの提案に感謝します。 – jkc

+0

詳細については、HSQLDBを 'server.silent = false'という設定のサーバとして実行し、実行されるSQLを表示してください。 – fredt

+0

私は 'server.silent = false'を試しましたが、なんらかの理由でそれが動作しませんでした。代わりに 'hsqldb.sqllog = 2'を試して、SQLを表示しました。 SQLを含めるために質問を編集しました。 – jkc

関連する問題