我们通过外部流程将数据导入数据库,并允许在应用程序内修改/添加数据。为避免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 ...
答案 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,这与原始物理序列定义不同。