我的PostgreSQL表具有bigserial
类型的id,这意味着它们是在插入行时生成的(因此,INSERT
语句中未提供id列的值)。我在XML映射文件中找不到<generator class="...">
属性的正确值。
下面的代码是我发现的最接近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>
答案 0 :(得分:20)
这是未记录的,但当PK类型为identity
或SERIAL
时,您实际上可以将BIGSERIAL
生成器与PostgreSQL一起使用:
<id name="id" column="user_id" type="java.lang.Long">
<generator class="identity"/>
</id>
答案 1 :(得分: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为a分配标识 持久对象,无需将对象的数据写入数据库, 允许NHibernate延迟写入,直到业务事务为止 完成,减少到数据库的往返。
虽然身份生成器是插入后POID生成器组:
插入后的POID生成器需要将数据持久保存到 要生成的ID的数据库。 这改变了行为 NHibernate以非常微妙的方式并禁用一些性能功能。 因此,强烈建议不要使用这些POID发生器!他们 应该只用于其他应用程序的现有数据库 依靠这种行为。
引自NHibernate 3.0 Cookbook。
答案 2 :(得分:1)
尝试以下并且有效:
<id name="id" column="id" type="long" unsaved-value="null" >
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>