sql >> Databasteknik >  >> RDS >> Oracle

Hibernate Jpa - undantag för begränsningsöverträdelse på primärnyckel (sekvens)

Oracle 10 Dialect

För Oracle10gDialect använd den här konfigurationen

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

Hibernate skapar en tabell och en sekvens:

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 

Under lagring får den först det nya sekvens-ID:t och skickar det sedan i INSERT uttalande

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

Oracle 12 Dialect

Om du använder Oracle 12 som inbyggt stöder IDENTITY column det är att föredra att uppgradera till Oracle12cDialect (observera att detta kräver Hibernate 5.3)

Ställ in strategy till GenerationType.IDENTITY

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

Följande tabell skapas - den viktiga delen generated as identity som tillhandahåller de unika velues. Notera att ingen explicit sequence krävs för att skapas, hanteras det internt .

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

Under lagring passas inget ID i INFOGA , tilldelas den av Oracle och returneras till sessionen

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

Observera att i motsats till Oracle 10 sparar du en tur och retur till databasen.



  1. Hur LPAD()-funktionen fungerar i MySQL

  2. Hur lägger man till en ny kolumn i MYSQL-tabellen?

  3. Hur konverterar man datetime-sträng utan avgränsare i SQL Server som datetime?

  4. Hur inaktiverar jag referensintegritet i Postgres 8.2?