gpt4 book ai didi

java - 如何在 Hibernate/JPA 中定义共享序列生成器?

转载 作者:行者123 更新时间:2023-11-30 06:35:06 25 4
gpt4 key购买 nike

我们通过外部进程将数据导入数据库,并且还允许在应用程序内修改/添加数据。为了避免 UUID 并简化代码,在外部进程中使用了单个 Oracle DB 序列 HIBERNATE_SEQUENCE,我需要将它用于受影响的实体。

我对每个实体的天真定义都失败了:

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HIBERNATE_SEQUENCE")
@SequenceGenerator(name = "HIBERNATE_SEQUENCE", sequenceName = "HIBERNATE_SEQUENCE")

与:

HibernateException: Multiple references to database sequence [hibernate_sequence] were encountered attempting toset conflicting values for 'increment size'.

仅在单个实体上定义:

@SequenceGenerator(name = "HIBERNATE_SEQUENCE", sequenceName = "HIBERNATE_SEQUENCE")

(以及其他的@GeneeratedValue)原因:

org.hibernate.AnnotationException: Unknown Id.generator: HIBERNATE_SEQUENCE

如何在不同实体上使用单个序列?

更新我还有:

org.hibernate.HibernateException: Multiple references to database sequence [hibernate_sequence] were encountered attempting toset conflicting values for 'increment size'. Found [1] and [50]

在之前的某个阶段,我将物理序列定义为:

create sequence HIBERNATE_SEQUENCE
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1;

默认 hibernate 步长为 50...

最佳答案

看起来使用单独的 Hibernate 逻辑名称的愚蠢解决方案有效:

@Entity
public class Cat {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Cat_seq")
@SequenceGenerator(name = "Cat_seq", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 1)
Long id;
}

@Entity
public class Dog {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Dog_seq")
@SequenceGenerator(name = "Dog_seq", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 1)
Long id;
}

SequenceGenerator.sequenceName 设置应该正确工作的物理序列名称,因为 Hibernate 无法对 Oracle DB 所在的分布式环境中物理对象的独占使用做出任何假设...

应提供

allocationSize = 1,因为默认值为 50,这与原始物理序列定义不同。

关于java - 如何在 Hibernate/JPA 中定义共享序列生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45332065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com