Подтвердить что ты не робот

Правильный генератор идентификаторов Hibernate для постсекретаря серийного/синтаксического столбца?

В моих таблицах PostgreSQL есть id типа 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>
4b9b3361

Ответ 1

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

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

См. HB-875 и HHH-1675 для фона.

Ответ 2

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

<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-генераторов настоятельно не рекомендуется! Oни следует использовать только с существующими базами данных, где другие приложения полагайтесь на это поведение.

Цитаты были взяты из Cookbook от NHibernate 3.0.

Ответ 3

Пробовал следовать и работал:

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