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.