Правильный генератор идентификаторов Hibernate для колонок postgres serial / bigserial? - PullRequest
18 голосов
/ 08 августа 2010

Мои таблицы PostgreSQL имеют идентификаторы типа bigserial, что означает, что они генерируются во время вставки строк (и, следовательно, значение столбца id не указывается в операторе INSERT). У меня возникают проблемы с поиском правильного значения атрибута <generator class="..."> в моем файле сопоставления XML.

Приведенный ниже код является самым близким, который, как я обнаружил, ближе всего к Postgres, но он все еще выполняет SELECT nextval(...) для последовательности перед вставкой (и явно включает значение поля id на вставке). Я просто хочу, чтобы Hibernate вообще не включал значение поля id, позволяя Postgres самостоятельно создавать значение.

    <id name="id" column="id" type="java.lang.Long">
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
    </id>

Ответы [ 3 ]

20 голосов
/ 08 августа 2010

Это недокументировано, но вы можете использовать генератор identity с PostgreSQL, когда PK имеет тип SERIAL или BIGSERIAL:

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

См. HB875 и ЧЧЧ-1675 для фона на этом.

4 голосов
/ 12 августа 2011

Из того, что я прочитал:

<id name="id" column="id" type="java.lang.Long">
    <generator class="sequence">
        <param name="sequence">my_sequence_name</param>
    </generator>
</id>

должно работать быстрее чем:

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

Генератор последовательности попадает в Генераторы POID без вставки , описанные так:

Генераторы POID без вставки - лучший вариант для новых приложений. Эти генераторы позволяют NHibernate назначать идентификационные данные постоянный объект без записи данных объекта в базу данных, позволяя NHibernate отложить запись до тех пор, пока бизнес-транзакция не станет завершено, сокращение количества обращений к базе данных.

Пока генератор идентификаторов Генераторы POID после вставки группа:

Генераторы POID после вставки требуют сохранения данных в база данных для идентификатора, который будет создан. Это изменяет поведение NHibernate очень тонкими способами и отключает некоторые функции производительности. Таким образом, использование этих генераторов POID настоятельно не рекомендуется! Они следует использовать только с существующими базами данных, где другие приложения положитесь на это поведение.

Цитаты взяты из поваренной книги NHibernate 3.0.

1 голос
/ 08 августа 2010

Попробовал следующее и все заработало:

<id name="id" column="id" type="long" unsaved-value="null" >
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
</id>
...