18

我的 PostgreSQL 表的 id 类型为bigserial,这意味着它们是在插入行时生成的(因此,INSERT语句中未提供 id 列的值)。我很难<generator class="...">在我的 XML 映射文件中找到该属性的正确值。

下面的代码是我发现的最接近 Postgres 的代码,但它仍然SELECT nextval(...)在插入之前对序列执行 a (并在插入时明确包括 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>
4

3 回答 3

20

这是未记录的,但当 PK 类型为or时,您实际上可以identity在 PostgreSQL 中使用生成器:SERIALBIGSERIAL

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

有关这方面的背景信息,请参见HB-875HHH-1675

于 2010-08-08T17:42:12.190 回答
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 生成器需要将数据持久化到数据库中以生成 ID。这以非常微妙的方式改变了 NHibernate 的行为并禁用了一些性能特性。因此,强烈建议不要使用这些 POID 生成器!它们只能与其他应用程序依赖此行为的现有数据库一起使用。

引用来自 NHibernate 3.0 Cookbook。

于 2011-08-12T07:53:57.830 回答
1

尝试以下,它的工作:

<id name="id" column="id" type="long" unsaved-value="null" >
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
</id>
于 2010-08-08T09:46:06.687 回答