2017-09-22 6 views
0

J'ai une configuration où la base de données Oracle (12c) est utilisée en production et HSQLDB (en mémoire) est utilisée pour les cas de test. J'utilise Liquibase pour mettre à jour la base de données.Problèmes avec la génération automatique d'identité en utilisant JPA2 sur HSQLDB

J'ai la classe suivante:

@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; 
} 

La définition Liquibase J'utilise pour cette table est:

"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 
       } 
      } 
     } 
    ] 
} 

Lors de la création d'un nouveau système en utilisant un EntityManager.persist sur la base de données Oracle fonctionne ce . Une ligne est insérée dans la base de données et le champ ID est rempli avec une valeur comme prévu.

Cela ne se produit pas dans la base de données HSQLDB. Et pour moi, il semble que la génération automatique ne soit pas déclenchée.

Le SQL exécuté par HSQLDB pour créer la table SYSTEM est:

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)) 

Yat-il un bug savoir dans HSQLDB ou que je fais quelque chose de mal?

+0

S'il s'agissait d'un bogue, _h2 database_ serait une alternative - aussi w.r.t. Liquibase. Il a même un mode de compatibilité Oracle. –

+0

Si c'est un bug ou si je ne trouve pas de solution, je vais essayer h2. Merci pour la suggestion. – jkc

Répondre

0

Vous devez ajouter ;sql.syntax_ora=true à la fin de l'URL de connexion JDBC.

Avec une base de données en mémoire, vous devez également vous assurer que le même processus Java est utilisé pour mettre à jour la base de données et l'interroger. Si deux processus distincts sont utilisés, la base de données créée par le premier processus disparaît à la fermeture du processus.

+0

'; sql.syntax_ora = true' est dans l'URL de connexion donc ça ne change rien, j'ai peur. Mais merci pour votre suggestion. – jkc

+0

Pour en savoir plus, exécutez HSQLDB en tant que serveur avec le paramètre 'server.silent = false' pour afficher le SQL exécuté. – fredt

+0

J'ai essayé 'server.silent = false' mais pour une raison quelconque cela n'a pas fonctionné. Au lieu de cela j'ai essayé 'hsqldb.sqllog = 2' et le SQL a été imprimé. J'ai édité ma question pour inclure le SQL. – jkc