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

时间:2017-07-26 16:00:58

标签: java oracle hibernate

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

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

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

使用:

  

HibernateException:遇到了对数据库序列[hibernate_sequence]的多次引用,试图为增加大小'设置冲突的值。

仅在单个实体上定义:

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

(以及其他人@GeneratedValue)导致:

  

org.hibernate.AnnotationException:未知Id.generator:HIBERNATE_SEQUENCE

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

更新我还有:

  

org.hibernate.HibernateException:遇到了对数据库序列[hibernate_sequence]的多次引用,试图为增加大小'设置冲突的值。找到[1]和[50]

在某个阶段,如前所述我将物理序列定义为:

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

和默认的休眠步骤是50 ...

1 个答案:

答案 0 :(得分:1)

看起来使用单独的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,这与原始物理序列定义不同。