sql >> Base de Datos >  >> RDS >> Oracle

Hibernate Jpa:excepción de violación de restricción en la clave principal (secuencia)

Dialecto de Oracle 10

Para Oracle10gDialect usar esta configuración

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

Hibernate crea una tabla y una secuencia:

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 

Mientras lo almacena, primero obtiene la nueva ID de secuencia y luego la pasa en INSERT declaración

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

Dialecto de Oracle 12

Si utiliza Oracle 12 que admite de forma nativa IDENTITY column se prefiere actualizar a Oracle12cDialect (tenga en cuenta que esto requiere Hibernate 5.3)

Establecer la strategy a GenerationType.IDENTITY

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

Se crea la siguiente tabla:la parte importante se generated as identity que proporciona los valores únicos. Tenga en cuenta que no hay una sequence explícita se requiere crear, se administra internamente.

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

Mientras se almacena no se pasa ningún ID en INSERT , es asignado por Oracle y devuelto a la sesión

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

Tenga en cuenta que, a diferencia de Oracle 10, se ahorra un viaje de ida y vuelta a la base de datos.