2017-07-26 129 views
1

我们通过外部进程将数据导入数据库,并允许在应用程序内部修改/添加数据。为了避免UUID和简化代码,单个Oracle DB序列HIBERNATE_SEQUENCE用于外部过程,我需要将它用于受影响的实体。如何在Hibernate/JPA中定义共享序列生成器?

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

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

有:

HibernateException的:数据库序列多参考文献[hibernate_sequence]遇到试图toset为 '增量大小' 冲突的值。

只在烧毛实体定义:

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

(和@GeneratedValue别人)原因:

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

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

UPDATE我也有:

org.hibernate.HibernateException:为[hibernate_sequence]遇到试图toset为 '增量大小' 冲突值数据库序列多个引用。实测值[1]和[50]

在如前面所定义我物理序列作为某一阶段:

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

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

回答

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设置物理顺序名称应correctl y工作,因为Hibernate不能假定在Oracle DB的分布式环境中专用物理对象...

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

相关问题