当前位置: 首页 > 面试题库 >

Hibernate为PostgreSQL插入生成两个不同的序列ID

解鸿运
2023-03-14
问题内容

我有一个用序列生成的主键定义的实体:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_key_gen")
@SequenceGenerator(name = "id_key_gen", sequenceName = "id_key_seq")
@Column(name = "id", unique = true, nullable = false)
public int getId() {
    return this.id;
}

我正在使用PostgreSQL,并且此密钥定义为序列号。根据PostgreSQL

select last_value from id_key_seq;

退货

1603.

当我执行create()来持久化此实体的实例时,我在日志中看到以下内容(不相关的内容已被删除):

05 15:15:26.948 org.hibernate.id.enhanced.SequenceStructure
[DEBUG]-获得的序列值:1604

05 15:15:26.948 org.hibernate.event.def.AbstractSaveEventListener
[DEBUG]-使用策略:org.hibernate.id.enhanced.SequenceStyleGenerator生成的标识符:1554

后续的SQL插入语句引用值1554,而不是它
使用的值1604(基于SequenceStructure返回的值。Hibernate从何处获取1554?

在我看来,Hibernate在这里有一个错误-SequenceStructure知道正确的下一个值,但未在使用它。任何想法如何解决这个问题?

仅供参考:我知道此页面,它说要使用GenerationType.AUTO,因为“hibernate的人完全把它搞砸了”,但是除了这个非常无用的陈述外,没有什么其他的。


问题答案:

看起来如果您使用GenerationType.SEQUENCE,则需要将“增量值”指定为1,以避免将序列用作高/低种子。

您发布的问题的第一个答案(有用的答案)说明您需要在@GeneratedValue批注中指定“ allocationSize = 1”。

在较新的Hibernate版本中,您可以改为hibernate.id.new_generator_mappings=true在Hibernate属性中进行设置。请参阅文档。



 类似资料:
  • 问题内容: 我可以为一个实体使用多个序列生成器吗? 问题答案: 你不能。该生成器仅适用于标识符列。 确保使用脚本(例如)创建此序列: 然后使用如下映射:

  • 问题内容: 下面的查询生成一行DNA序列 结果-dna CCCGGTTCTCCCCATGCAGG 我想生成10个随机DNA序列 问题答案: 像这样吗?

  • 我有两个表A(id,col1,col2)和B(col3,col4,col5,col6) 这引发错误 为什么postgres不自动为列“id”生成值?如果我从表B中提供“id”,或者如果我插入单行(没有select)并为自动生成的列提供“default”关键字,查询就可以工作。 编辑:表创建查询

  • 现在我有了hibernate的工作批插入(“hibernate.jdbc.batch_size=50”),但据我所知,hibernate会批量生成单个插入。我知道我可以告诉我的db驱动程序为每批插入创建多行插入,以使用rewriteBatchedStatements:jdbc:p加快性能ostgresql://localhost:5432/mydb?rewriteBatchedStatements

  • 我在尝试将HiberNate与SAP HANA In-Memory数据库连接时遇到了一些性能问题,该数据库不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)。 因此,我将HiberNate设置为使用序列生成ID。 但是当我插入大量记录(例如,40000)时,Hibernate首先会生成ID。它看起来像: 只有在生成所有 ID 后,它才会开始实际