postgres串行/大串行列的正确休眠ID生成器?

Posted

技术标签:

【中文标题】postgres串行/大串行列的正确休眠ID生成器?【英文标题】:Proper Hibernate id generator for postgres serial/bigserial column? 【发布时间】:2011-03-26 21:53:20 【问题描述】:

我的 PostgreSQL 表的 id 类型为 bigserial,这意味着它们是在插入行时生成的(因此,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>

【问题讨论】:

【参考方案1】:

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

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

请参阅 HB-875 和 HHH-1675 了解这方面的背景。

【讨论】:

对于新版本 (JPA):***.com/questions/4979746/…【参考方案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。

【讨论】:

看起来你比较的两个代码块是相同的,我错过了什么吗?【参考方案3】:

尝试了以下方法并成功了:

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

【讨论】:

以上是关于postgres串行/大串行列的正确休眠ID生成器?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将 id 生成器序列与表相关联

在 Postgres 中的现有列中添加“串行”

POSTGRES - 使用 ON CONFLICT DO NOTHING 防止串行增量 [重复]

从 java pojo 类生成休眠查询

Postgres没有用hibernate正确创建表?

什么 Postgres 类型将映射到休眠中 Float 类型的列?