Oracle
 sql >> база данни >  >> RDS >> Oracle

Hibernate Jpa - изключение за нарушение на ограничението на първичен ключ (последователност)

Oracle 10 Dialect

За Oracle10gDialect използвайте тази конфигурация

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

Hibernate създава таблица и последователност:

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 

Докато се съхранява, той първо получава новия ID на последователността и след това го предава в INSERT изявление

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

Oracle 12 Dialect

Ако използвате Oracle 12 който първоначално поддържа IDENTITY column за предпочитане е да надстроите до Oracle12cDialect (обърнете внимание, че това изисква Hibernate 5.3)

Задайте strategy към GenerationType.IDENTITY

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

Създава се следната таблица - важната част е generated as identity който осигурява уникалните стойности. Имайте предвид, че няма изрична sequence трябва да бъде създаден, той се управлява вътрешно .

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

При съхраняване не се предава ID в INSERT , той се присвоява от Oracle и се връща в сесията

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

Имайте предвид, че за разлика от Oracle 10 спестявате едно отиване и връщане до базата данни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. вмъкване на множество редове в Oracle SQL

  2. Oracle последователност, но след това в MS SQL Server

  3. JDBC връзка към база данни на Oracle с помощта на TLS сертификат

  4. Как да разделя колона varchar като множество стойности в SQL?

  5. Получаване на преброяване/общо на всяко ниво на йерархична заявка с помощта на CONNECT BY