Oracle
 sql >> Base de données >  >> RDS >> Oracle

Hibernate Jpa - exception de violation de contrainte sur la clé primaire (séquence)

Dialecte Oracle 10

Pour Oracle10gDialect utiliser cette configuration

@Id
@Column(name = "MY_PRIMARY_KEY")
@GeneratedValue(strategy=GenerationType.AUTO)
Long myPrimaryKey;

Hibernate crée une table et une séquence :

create table MY_TABLE (
MY_PRIMARY_KEY number(19,0) not null, 
VALUE varchar2(255 char), 
primary key (MY_PRIMARY_KEY))

create sequence hibernate_sequence 

Lors du stockage, il obtient d'abord le nouvel ID de séquence, puis le transmet dans le INSERT déclaration

select hibernate_sequence.nextval from dual
insert into MY_TABLE (VALUE, MY_PRIMARY_KEY) values (?, ?)

Dialecte Oracle 12

Si vous utilisez Oracle 12 qui prend en charge nativement IDENTITY column il est préférable de passer à Oracle12cDialect (notez que cela nécessite Hibernate 5.3)

Définir la strategy à GenerationType.IDENTITY

@Id
@Column(name = "MY_PRIMARY_KEY", updatable = false, nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
Long myPrimaryKey;

La table suivante est créée - la partie importante est generated as identity qui fournit les valeurs uniques. Notez qu'aucune sequence explicite doit obligatoirement être créé, il est géré en interne .

create table MY_TABLE (
MY_PRIMARY_KEY number(19,0) generated as identity, 
VALUE varchar2(255 char), 
primary key (MY_PRIMARY_KEY))

Lors du stockage aucun ID n'est passé dans l'INSERT , il est attribué par Oracle et renvoyé à la session

insert into MY_TABLE (VALUE) values (?) RETURNING MY_PRIMARY_KEY INTO ? 

Notez que contrairement à l'Oracle 10 vous économisez un aller-retour vers la base de données.