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 为 SERIAL
或 BIGSERIAL
类型时,您实际上可以在 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生成器?的主要内容,如果未能解决你的问题,请参考以下文章