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

Mau*_*cio 6 java orm hibernate jpa

我有一个带有@Id和@TableGenerator的'dog'Entitiy

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

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

dog = 1,dog = 2,dog = 3,cat = 4,cat = 5,dog = 6等等......

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

如果我添加了@GeneratedValue(发电机="dog_gen")对我的猫实体,省略@TableGenerator声明抛出一个异常说开始的背景下,当它找不到发电机.

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) 
Run Code Online (Sandbox Code Playgroud)

Pas*_*ent 3

事实上,这不是我在阅读 javadoc 后所期望的@TableGenerator

该注释定义了一个主键生成器,当为该注释指定生成器元素时,可以通过名称引用该生成器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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

  • 我尝试过...它似乎只能工作,因为分配大小为 1。但实际上,单独的生成器是创建并单独工作的。如果您选择大于 1 的分配大小,您将看到每个实体都有不同的 ID 范围。(这里使用 Hibernate 3.6,也许 4.x 效果更好?) (3认同)