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

Hibernate Jpa - undtagelse for overtrædelse af begrænsninger på primærnøgle (sekvens)

Oracle 10 Dialect

Til Oracle10gDialect brug denne konfiguration

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

Hibernate opretter en tabel og 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 

Mens den lagres, får den først det nye sekvens-ID og sender det derefter i INSERT erklæring

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

Oracle 12 Dialect

Hvis du bruger Oracle 12 der indbygget understøtter IDENTITY column det foretrækkes at opgradere til Oracle12cDialect (bemærk, at dette kræver Hibernate 5.3)

Indstil strategy til GenerationType.IDENTITY

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

Følgende tabel er oprettet - den vigtige del er generated as identity som giver de unikke veluer. Bemærk, at ingen eksplicit sequence skal oprettes, administreres 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 overføres intet ID i INSERT , det tildeles af Oracle og returneres til sessionen

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

Bemærk, at i modsætning til Oracle 10 sparer du én tur-retur til databasen.



  1. Tillader en bruger at videregive tabelnavn og kolonnenavn, mens SQL-injektion forhindres

  2. Er der en måde kun at begrænse det nedre område i mysql?

  3. Sådan kontrolleres Oracle Client installeret eller ej som forudsætning for komponentinstallation

  4. Hvordan vælger jeg fra Masseindsamlet Table of Records Type