Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Hibernate Jpa - exceção de violação de restrição na chave primária (sequência)

Dialeto do Oracle 10


Para Oracle10gDialect use esta configuração
@Id
@Column(name = "MY_PRIMARY_KEY")
@GeneratedValue(strategy=GenerationType.AUTO)
Long myPrimaryKey;

O Hibernate cria uma tabela e uma sequência:
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 

Ao armazená-lo, primeiro obtém o novo ID de sequência e depois o passa no INSERT declaração
select hibernate_sequence.nextval from dual
insert into MY_TABLE (VALUE, MY_PRIMARY_KEY) values (?, ?)

Dialeto do Oracle 12


Se você usa o Oracle 12 que suporta nativamente IDENTITY column é preferível atualizar para Oracle12cDialect (observe que isso requer o Hibernate 5.3)

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

A tabela a seguir é criada - a parte importante é generated as identity que fornece os velues exclusivos. Observe que nenhuma sequence explícita deve ser criado, ele é gerenciado internamente.
create table MY_TABLE (
MY_PRIMARY_KEY number(19,0) generated as identity, 
VALUE varchar2(255 char), 
primary key (MY_PRIMARY_KEY))

Ao armazenar nenhum ID é passado no INSERT , ele é atribuído pelo Oracle e retornado à sessão
insert into MY_TABLE (VALUE) values (?) RETURNING MY_PRIMARY_KEY INTO ? 

Observe que, ao contrário do Oracle 10, você economiza uma viagem de ida e volta ao banco de dados.