Oracle
 sql >> Database >  >> RDS >> Oracle

Hibernate Jpa - eccezione di violazione del vincolo sulla chiave primaria (sequenza)

Dialetto Oracle 10

Per Oracle10gDialect usa questa configurazione

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

Hibernate crea una tabella e una sequenza:

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 

Durante la memorizzazione, prima ottiene il nuovo ID sequenza e poi lo passa nel INSERT dichiarazione

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

Dialetto Oracle 12

Se utilizzi Oracle 12 che supporta in modo nativo IDENTITY column è preferibile eseguire l'upgrade a Oracle12cDialect (nota che questo richiede Hibernate 5.3)

Imposta la strategy a GenerationType.IDENTITY

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

Viene creata la tabella seguente:la parte importante è generated as identity che fornisce i valori univoci. Nota che nessuna sequence esplicita deve essere creato, è gestito internamente.

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

Durante la memorizzazione di nessun ID viene trasmesso nell'INSERT , viene assegnato da Oracle e restituito alla sessione

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

Nota che, contrariamente a Oracle 10, salvi un viaggio di andata e ritorno nel database.