====== 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): hibernate_sequence ===== 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''.