Estratégia de Geração de Chaves Primárias com Hibernate
Com o objetivo de generalizar a forma de criação das chaves primárias de forma a dar suporte tanto a bancos que utilizam o conceito de sequence (PostgreSQL, Oracle) quanto aos que não utilizam (SQL Server, MySQL), foi definido que é necessário mudar a estratégia de geração de chaves primárias do Hibernate.
Na documentação do Hibernate, capítulo 25 (Database Portability Issues), seção 25.4 (Identifier generation), foi encontrada uma outra estratégia que resolve esse problema. É a SequenceStyleGenerator, que funciona da seguinte maneira: se o banco suportar sequence, usa a sequence normalmente. Se o banco não suportar a sequence, ele pega o próximo valor de uma tabela cujo nome é o nome da sequence e possui uma coluna com o nome next_val, utilizando um select for update e incrementando o valor em seguida.
O uso com anotações é o seguinte (deve-se substituir o parâmetro sequence_name pelo nome da sequence a ser usada):
@Id @GeneratedValue(generator="seqGenerator") @GenericGenerator(name="seqGenerator", strategy="br.ufrn.arq.dao.SequenceStyleGenerator", parameters={ @Parameter(name="sequence_name", value="hibernate_sequence") }) private int id;
O uso com XML é o seguinte (deve-se substituir o parâmetro sequence_name pelo nome da sequence a ser usada):
<id name="id" column="ID"> <generator class="br.ufrn.arq.dao.SequenceStyleGenerator"> <param name="sequence_name">hibernate_sequence</param> </generator> </id>
Schema padrão das sequences
Caso não seja informado no nome da sequence qual o seu schema, o SequenceStyleGenerator
irá utilizar o definido no arquivo banco.properties
, em br.ufrn.arq.dao
. Para mudar o schema padrão, deve-se mudar o valor para a chave schema_padrao_sequences
.