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

17

В моих таблицах 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>
    
задан Matt Huggins 08.08.2010 в 11:04
источник

3 ответа

19

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

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

См. HB-875 и HHH-1675 для получения дополнительной информации об этом.

    
ответ дан Pascal Thivent 08.08.2010 в 19:42
  • Для новых версий (JPA): stackoverflow.com/questions/4979746/... –  Christian Vielma 31.07.2012 в 21:04
4

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

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

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

    
ответ дан Răzvan Flavius Panda 12.08.2011 в 09:53
  • Кажется, что ваши два блока кода, которые вы сравниваете, идентичны, я что-то упускаю? –  Matt Huggins 12.08.2011 в 17:30
  • @Matt Huggins: я вставил неправильно: D изменен сейчас –  Răzvan Flavius Panda 12.08.2011 в 23:08
1

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

<id name="id" column="id" type="long" unsaved-value="null" >
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
</id>
    
ответ дан YoK 08.08.2010 в 11:46