Gerador de ID de Hibernate adequado para coluna serial/bigserial postgres?
-
26-09-2019 - |
Pergunta
Minhas tabelas PostgreSQL possuem IDs do tipo bigserial
, o que significa que eles são gerados no momento em que as linhas são inseridas (e, portanto, o valor da coluna id não é fornecido no INSERT
declaração).Estou tendo dificuldade em encontrar o valor adequado para o <generator class="...">
atributo em meu arquivo de mapeamento XML.
O código abaixo é o mais próximo que encontrei e parece ser o mais próximo do Postgres, mas ainda está executando um SELECT nextval(...)
na sequência antes da inserção (e incluindo explicitamente o valor do campo id na inserção).Eu só quero que o Hibernate não inclua o valor do campo id, permitindo que o Postgres faça seu trabalho de gerar o próprio valor.
<id name="id" column="id" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>
Outras dicas
Pelo que li:
<id name="id" column="id" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>
deve funcionar mais rápido do que:
<id name="id" column="id" type="java.lang.Long">
<generator class="identity" />
</id>
O gerador de sequência cai no Geradores POID sem inserção descrito assim:
Geradores POID sem inserção são a melhor opção para novas aplicações.Esses geradores permitem que o NHibernate atribua uma identidade a um objeto persistente sem gravar os dados do objeto no banco de dados, permitindo que o NHibernate atrase a gravação até que a transação comercial seja completa, reduzindo as idas e vindas ao banco de dados.
Embora o gerador de identidade seja Geradores POID pós-inserção grupo:
Os geradores POID pós-inserção exigem que os dados sejam persistentes para o banco de dados para um ID a ser gerado. Isso altera o comportamento de O NHibernate de maneiras muito sutis e desabilita alguns recursos de desempenho.Como tal, a utilização destes geradores POID é fortemente desencorajada! Eles só deve ser usado com bancos de dados existentes onde outros aplicativos confie nesse comportamento.
As citações foram retiradas do NHibernate 3.0 Cookbook.
Tentei seguir e funcionou:
<id name="id" column="id" type="long" unsaved-value="null" >
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>