我的postgresql表具有类型的ID bigserial, ,这意味着它们是在插入时生成的(因此,ID列的值未提供 INSERT 陈述)。我很难找到适合的价值 <generator class="..."> 我的XML映射文件中的属性。

下面的代码是我发现的最接近的代码,它似乎是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>
有帮助吗?

解决方案

这是无证的,但您实际上可以使用 identity 当PK类型时,带有PostgreSQL的发电机 SERIAL 或者 BIGSERIAL:

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

HB-875HHH-1675 为此。

其他提示

从我阅读的内容中:

<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将身份分配给持续的对象,而无需将对象的数据写入thedatabase,从而允许NHIBERNATE延迟写入,直到业务交易完成,并减少到数据库的圆形旅行。

当身份生成器是 插入后的POID发电机 团体:

插入后POID生成器要求将数据持续到数据库中,以生成ID。 这以非常微妙的方式改变了NHIBERNATE的行为,并禁用了一些性能功能。因此,强烈劝阻这些Poid发电机的使用! 它们仅应与其他应用程序依赖此行为的现有数据库一起使用。

引号是从Nhibernate 3.0食谱中获取的。

尝试关注并起作用:

<id name="id" column="id" type="long" unsaved-value="null" >
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
</id>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top