Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA@TableGenerator在多个实体之间共享_Java_Hibernate_Orm_Jpa - Fatal编程技术网

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

Java JPA@TableGenerator在多个实体之间共享,java,hibernate,orm,jpa,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; ... 有没有办法在其他实体中重用

我有一个带有@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, cat=4, cat=5, 狗=6 等等

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

如果我在cat实体上添加@GeneratedValue(generator=“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) 

事实上,这并不是我在阅读了
@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;

我试过了。。。它似乎只起作用,因为分配大小为1。但实际上,单独的生成器是单独创建和工作的。如果选择大于1的分配大小,您将看到每个实体具有不同的id范围。(在这里使用Hibernate 3.6,也许它在4.x中工作得更好?)