JPA @TableGenerator在多个实体之间共享 [英] JPA @TableGenerator shared between multiple entities

查看:205
本文介绍了JPA @TableGenerator在多个实体之间共享的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  ... 
@ TableGenerator(table =seq,name =dog_gen,pkColumnName =seq_name,valueColumnName =seq_val)
@Id @GeneratedValue(strategy = GenerationType.TABLE,generator =dog_gen)
私人长ID;
...

有没有一种方法可以重复使用同一个表生成器(dog_gen)其他实体?我想在两个独立的实体中保持相同的ID序列,比如说:

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


如果我添加 @GeneratedValue(generator =dog_gen)

如果我添加了 @GeneratedValue(generator =dog_gen)

b>在我的cat实体上,省略@TableGenerator声明会抛出一个异常,说它在启动上下文时找不到生成器。

 由org.hibernate.AnnotationException引发:org.hibernate.AnnotationException:未知Id.generator:dog_gen $ b $在org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:413)
在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 )在org.hibernate.cfg.AnnotationConfiguratio上

at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:277)


解决方案

的确,这并不是我在阅读 @TableGenerator 的javadoc后所期待的:
$ b


这个注解定义了一个主键生成器,当为 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)
私人长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;


I have a 'dog' Entitiy with an @Id and a @TableGenerator

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

Is there a way to reuse the same table generator (dog_gen) in other entity? I want to keep the same id sequence in two independent Entities, say

dog=1, dog=2, dog=3, cat=4, cat=5, dog=6 and so on...

Both entities don't share a common superclass to implement some kind of inheritance with the id property.

If I add the @GeneratedValue( generator="dog_gen") on my cat entity, omitting the @TableGenerator declaration throws an Exception saying it can't find the generator when starting the context.

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) 

解决方案

Indeed and this is not what I was expecting after reading the javadoc of @TableGenerator:

This annotation defines a primary key generator that may be referenced by name when a generator element is specified for the GeneratedValue annotation. A table generator may be specified on the entity class or on the primary key field or property. The scope of the generator name is global to the persistence unit (across all generator types).

Maybe I'm not interpreting things correctly (the section 9.1.38 of the JPA spec doesn't tell us more) but I was expecting to be able to reference a generator name from another Entity in the @GeneratedValue.

Anyway, the following seems to work. In the Dog entity:

@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;

And in the Cat, well, the same:

@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;

这篇关于JPA @TableGenerator在多个实体之间共享的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆