2010-04-29 52 views
6

之間共享我有一個「狗」 Entitiy與@Id和@TableGeneratorJPA @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聲明會拋出一個Exception,表示它在啓動上下文時找不到生成器。

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) 

回答

3

事實上,這是不是我所讀的@TableGenerator的Javadoc後期待:

此註釋定義了可通過名稱時的指定生成元被引用的主鍵生成GeneratedValue註釋。表生成器可以在實體類或主鍵字段或屬性上指定。 生成器名稱的範圍對於持久性單元(跨所有生成器類型)是全局的。

也許我不能正確解釋的東西(JPA規範的部分38年9月1日並沒有告訴我們更多),但我期待能夠在@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; 
+2

我想它...它似乎只是爲了工作,因爲分配大小爲1。但實際上,獨立發電機被創建並單獨工作。如果您選擇大於1的分配大小,您將看到每個實體都有不同的id範圍。 (在這裏使用Hibernate 3.6,或許它對4.x更好?) – 2013-08-16 13:58:29