Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Hibernate Jpa - Einschränkungsverletzungsausnahme für Primärschlüssel (Sequenz)

Oracle 10-Dialekt

Für Oracle10gDialect Verwenden Sie diese Konfiguration

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

Hibernate erstellt eine Tabelle und eine Sequenz:

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 

Beim Speichern erhält es zuerst die neue Sequenz-ID und übergibt sie dann im INSERT Erklärung

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

Oracle 12 Dialekt

Wenn Sie Oracle 12 verwenden die nativ IDENTITY column ein Upgrade auf Oracle12cDialect wird bevorzugt (Beachten Sie, dass hierfür Hibernate 5.3 erforderlich ist)

Legen Sie die strategy fest zu GenerationType.IDENTITY

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

Die folgende Tabelle wird erstellt - der wichtige Teil wird generated as identity die die eindeutigen Werte bereitstellt. Beachten Sie, dass keine explizite sequence erstellt werden muss, wird intern verwaltet .

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

Beim Speichern wird im INSERT keine ID übergeben , wird von Oracle zugewiesen und an die Sitzung zurückgegeben

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

Beachten Sie, dass Sie im Gegensatz zu Oracle 10 einen Roundtrip zur Datenbank sparen.