适用于postgres serial / bigserial列的正确Hibernate id生成器?

时间:2010-08-08 09:04:30

标签: java hibernate postgresql mapping hibernate-mapping

我的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>

3 个答案:

答案 0 :(得分:20)

这是未记录的,但当PK类型为identitySERIAL时,您实际上可以将BIGSERIAL生成器与PostgreSQL一起使用:

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

请参阅 HB-875 HHH-1675了解相关背景。

答案 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>