1

J'essaie de mapper mes objets de domaine pour utiliser les nouvelles clés primaires de type d'identité Oracle 12c, auto-incrémentation AKA dans certains autres systèmes.Configurer Grails 3.0.9 pour Oracle 12c avec PK d'identité?

Hibernate 4 n'a pas Oracle12cDialect, il a seulement Oracle10gDialect. Oracle10gDialect a une méthode appelée supportsIdentityColumns() qui est codée en dur pour renvoyer false, mappant ainsi mon objet domaine GORM avec le générateur: "identity" entraîne une erreur indiquant que Oracle10gDialect ne prend pas en charge le générateur d'identité.

Je ne peux pas utiliser le générateur de sélection GORM car je n'ai pas de clé unique secondaire et je ne peux pas utiliser de clé Hibernate parce qu'Hibernate et d'autres insertions (externes) dans les tables génèrent des chevauchements.

Exemple d'Oracle Existant 12c DDL:

create table person (
      id number(10,0) generated by default as identity, 
      version number(10,0) not null, 
      home_address_id number(10,0), 
      name varchar(255) not null, 
      primary key (id) 
    ); 

GORM Objet:

class Person { 

    String name 
    Address homeAddress 

    static mapping = { 
     id column: 'person_key', generator: 'identity' 
    } 

    static constraints = { 
     homeAddress nullable: true 
    } 
} 

En mémoire DB Résultat (Travaux parfait):

Hibernate: create table person (person_key bigint generated by default as identity, version bigint not null, home_address_id bigint, name varchar(255) not null, primary key (person_key)) 
Hibernate: alter table person add constraint FK_bemy93e8a8i6nknj4n21m6fub foreign key (home_address_id) references address 
Hibernate: insert into person (person_key, version, home_address_id, name) values (null, ?, ?, ?) 

Résultat Oracle DB (Broken):

org.hibernate.MappingException: org.hibernate.dialect.Oracle10gDialect does not support identity key generation 

Comment puis-je obtenir Grails 3.0.9 de travailler avec la définition ci-dessus de la table Oracle?

Répondre

1

Hibernate 4 ne peut pas être configuré pour utiliser la génération de clé d'identité Oracle 12c.

La création d'un Oracle12cDialect personnalisé ne nous permettait pas d'utiliser la génération de clé d'identité. Il nécessite un support supplémentaire dans Hibernate 4 qui n'est pas là.

Qu'est-ce que le travail est collé avec le Oracle10gDialect et en utilisant un générateur: « séquence d'identité », puis nommer la séquence comme ceci:

static mapping = { 
    id column: 'person_key', generator: 'sequence-identity', params:[sequence:'person_seq'] 
} 

Cela permet d'atteindre pratiquement le même résultat autre que la création des tableaux avec l'identité mot clé dans le DDL. Même si nous avions réussi à obtenir le mot-clé identity dans la définition de la table, Oracle aurait simplement créé sa propre séquence en arrière-plan pour l'utiliser chaque fois qu'un enregistrement était inséré. L'utilisation de l'identité de séquence plutôt que de la séquence évite également l'appel de la double DB pour insérer une nouvelle ligne.Avec séquence d'identité l'insert DML est un seul appel comme celui-ci:

insert into person (person_key, version, home_address_id, name) values (person_seq.nextval, ?, ?, ?) 

Avec générateur: « séquence » de nouveaux inserts de disques deviennent deux DB appelle comme ceci:

select person_seq.nextval from dual; 
insert into person (person_key, version, home_address_id, name) values (?, ?, ?, ?) 

Ainsi, le seul inconvénient que je voir pour 'identity-sequence' sur 'identity' est simplement qu'Oracle ne gardera pas automatiquement trace de la séquence à utiliser pour quelle table et l'utilisera automatiquement lorsqu'aucune valeur clé n'est fournie dans l'instruction insert. Mais même cela pourrait probablement être géré par un trigger avant l'insertion, à quel point vous pourriez être presque exactement où vous seriez quand Hibernate 4 aurait supporté generator: identity.

0

Hibernate 5 est-ce que a un Oracle 12c Dialect, ajoutant spécifiquement le support "identity": org.hibernate.dialect.Oracle12cDialect. Donc, soit utiliser Hibernate 5, soit écrire un dialecte personnalisé basé sur 12c pour Hibernate 4.

+0

Je sais, j'aimerais utiliser Hibernate 5, mais je ne pense pas que Grails a le support pour Hibernate 5 encore le fait? La dernière version du plugin que je peux trouver est celle-ci: org.grails.plugins: hibernate: 4.3.10.5. – DAC

+0

Nous essayons d'écrire notre propre dialecte personnalisé. Je vais répondre avec le résultat de cela sous peu. – DAC

+0

Implémenter notre propre dialecte Oracle 12c et cela n'a pas fonctionné. Lorsque nous avons mis en place le dialecte personnalisé, il est devenu clair qu'il y a d'autres changements qui doivent être faits dans d'autres parties du greffon Grails Hibernate. – DAC