Ответ 1
Это недокументировано, но вы действительно можете использовать генератор identity
с PostgreSQL, когда PK имеет тип SERIAL
или BIGSERIAL
:
<id name="id" column="user_id" type="java.lang.Long">
<generator class="identity"/>
</id>
В моих таблицах 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>
Это недокументировано, но вы действительно можете использовать генератор identity
с PostgreSQL, когда PK имеет тип SERIAL
или BIGSERIAL
:
<id name="id" column="user_id" type="java.lang.Long">
<generator class="identity"/>
</id>
Из того, что я читал:
<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.
Пробовал следовать и работал:
<id name="id" column="id" type="long" unsaved-value="null" >
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>