Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Hibernate Jpa — wyjątek naruszenia ograniczeń w kluczu podstawowym (sekwencja)

Dialekt Oracle 10

Dla Oracle10gDialect użyj tej konfiguracji

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

Hibernate tworzy tabelę i sekwencję:

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 

Podczas zapisywania najpierw otrzymuje nowy identyfikator sekwencji, a następnie przekazuje go w INSERT oświadczenie

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

Dialekt Oracle 12

Jeśli używasz Oracle 12 który natywnie obsługuje IDENTITY column preferowane jest uaktualnienie do Oracle12cDialect (zauważ, że wymaga to Hibernacji 5.3)

Ustaw strategy do GenerationType.IDENTITY

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

Utworzona jest następująca tabela - ważna część jest generated as identity co zapewnia unikalne właściwości. Zauważ, że nie ma jawnej sequence jest wymagane do utworzenia, jest zarządzane wewnętrznie.

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

Podczas przechowywania żadny identyfikator nie jest przekazywany do INSERT , jest przypisywany przez Oracle i powraca do sesji

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

Pamiętaj, że w przeciwieństwie do Oracle 10 oszczędzasz jedną podróż w obie strony do bazy danych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzenie DDL dla linii bazowej dla drogi przelotu

  2. ORA-12519 TNS:nie znaleziono odpowiedniej obsługi serwisowej

  3. Jaka jest główna różnica między Varchar2 a char

  4. Sekwencja Oracle dla pola klucza podstawowego nie pobiera aktualnie wstawionej wartości w Hibernate

  5. Jak wstawić znacznik czasu w Oracle w określonym formacie?