为postgres串行/大序列列提供适当的休眠ID生成器?

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

下面的代码是我发现的最接近的,似乎是Postgres最接近的,但它在插入之前仍然在序列上执行(并在插入中显式包含id字段的值)。我只是希望Hibernate根本不包含id字段值,允许Postgres完成生成值本身的工作。SELECT nextval(...)

    <id name="id" column="id" type="java.lang.Long">
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
    </id>

答案 1

这是未记录的,但是当PK类型为或:identitySERIALBIGSERIAL

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

有关这方面的背景,请参阅HB-875HHH-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 生成器要求将数据保存到数据库中,以便生成 ID。这以非常微妙的方式改变了NHibernate的行为,并禁用了一些性能功能。因此,强烈建议不要使用这些 POID 生成器!它们应仅用于其他应用程序依赖此行为的现有数据库。

引用取自NHibernate 3.0 Cookbook。


推荐