有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

postgres serial/bigserial列的java适当Hibernate id生成器?

我的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) 个答案

  1. # 1 楼答案

    从我读到的:

    <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生成器,如下所述:

    Non-insert POID generators are the best option for new applications. These generators allow NHibernate to assign an identity to a persistent object without writing the object's data to thedatabase, allowing NHibernate to delay writing until the business transaction is complete, reducing round trips to the database.

    当标识生成器为插入后POID生成器时,组:

    Post-insert POID generators require data to be persisted to the database for an ID to be generated. This alters the behavior of NHibernate in very subtle ways and disables some performance features. As such, use of these POID generators is strongly discouraged! They should only be used with existing databases where other applications rely on this behavior.

    引用自NHibernate 3.0食谱

  2. # 2 楼答案

    这是没有文档记录的,但是当PK类型为SERIALBIGSERIAL时,实际上可以将identity生成器与PostgreSQL一起使用:

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

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

  3. # 3 楼答案

    尝试了以下操作并成功:

    <id name="id" column="id" type="long" unsaved-value="null" >
            <generator class="sequence">
                <param name="sequence">my_sequence_name</param>
            </generator>
    </id>