JPA @TableGenerator在多个实体之间共享

时间:2010-04-29 23:30:09

标签: java hibernate orm jpa

我有一个带有@Id和@TableGenerator的'狗'实体

...
@TableGenerator(table = "seq", name = "dog_gen", pkColumnName = "seq_name", valueColumnName="seq_val")
@Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen")
private Long id;
...

有没有办法在其他实体中重用相同的表生成器(dog_gen)?我想在两个独立的实体中保持相同的id序列,比如说

狗= 1, 狗= 2, 狗= 3, 猫= 4, 猫= 5, 狗= 6 等等...

两个实体不共享一个公共超类来实现与id属性的某种继承。

如果我在我的cat实体上添加 @GeneratedValue(generator =“dog_gen”),省略@TableGenerator声明会抛出一个异常,说它在启动上下文时找不到生成器。 / p>

Caused by: org.hibernate.AnnotationException: Unknown Id.generator: dog_gen
at org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:413)
at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1795)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1229)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:733)
at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:498)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:277) 

1 个答案:

答案 0 :(得分:3)

确实,这不是我在阅读@TableGenerator的javadoc之后所期待的:

  

此注释定义了主键生成器,当为GeneratedValue注释指定了生成器元素时,可以通过名称引用该生成器。可以在实体类或主键字段或属性上指定表生成器。 生成器名称的范围对于持久性单元是全局的(跨所有生成器类型)。

也许我没有正确解释事情(JPA规范的第9.1.38节没有告诉我们更多)但我希望能够从@GeneratedValue中的另一个实体引用生成器名称

无论如何,以下似乎都有效。在Dog实体中:

@TableGenerator(table = "myseq", name = "dog_gen", pkColumnName = "seq_name", 
      valueColumnName = "seq_val", pkColumnValue = "Dog", allocationSize = 1)
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen")
private Long id;

Cat中,同样地:

@TableGenerator(table = "myseq", name = "dog_gen", pkColumnName = "seq_name", 
      valueColumnName = "seq_val", pkColumnValue = "Dog", allocationSize = 1)
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen")
private Long id;