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>
Foi útil?

Solução

Isso não está documentado, mas você pode realmente usar um identity gerador com postgreSql quando o PK é do tipo SERIAL ou BIGSERIAL:

<id name="id" column="user_id" type="java.lang.Long">
     <generator class="identity"/>
</id>

Ver HB-875 e HHH-1675 Para um fundo sobre isso.

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top