2010-04-29 11 views
6

arasında paylaşılan Bir @id ile 'köpek' kiflili¤i ve @TableGeneratorJPA @TableGenerator birden kuruluşlar

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

Diğer taraf olan aynı tablo jeneratör (dog_gen) yeniden bir yolu var mı var? Ben, iki bağımsız varlıkları aynı id dizisini kalmasını istiyor

köpek = 1, köpek = 2, köpek = 3, kedi = 4, kedi = 5, köpek = 6 ve benzeri ...

Her iki varlık da, id özelliği ile bir çeşit miras uygulamak için ortak bir üst sınıf paylaşmaz.

Ben @TableGenerator beyanı atlayarak, kedimin varlık üzerinde @GeneratedValue (jeneratör = "dog_gen") eklerseniz bağlamı başlatırken o jeneratör bulamıyorum diyerek bir özel durum atar.

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) 

cevap

3
Nitekim

ve bu @TableGenerator ait javadoc okuduktan sonra bekliyordum ne değildir:

Bu açıklama bir jeneratör elemanı için belirtilen zaman adıyla başvurulan edilebilir bir birincil anahtar jeneratör tanımlamaktadır GeneratedValue ek açıklaması. Bir varlık sınıfı, varlık sınıfı veya birincil anahtar alan veya özellik üzerinde belirtilebilir. Jeneratör adının kapsamı, kalıcılık birimine (tüm jeneratör tiplerinde) geneldir.

Belki (diğer söylemezse JPA spec bölüm 9.1.38) düzgün şeyler yorumlamak değilim ama @GeneratedValue başka Varlık bir jeneratör adını referans edebilmek için bekliyordum. Her neyse, aşağıdakiler işe yarıyor gibi görünmektedir.

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

Ve Cat yılında, iyi, aynı: Dog varlık olarak ayırma boyutu 1'dir Ama çünkü

@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

Ben denedim ... tek işe GÖRÜNÜYOR aslında ayrı jeneratörler ans ayrı ayrı oluşturulur. 1'den büyük bir ayırma boyutu seçerseniz, her varlık için farklı kimlik aralıklarınızın olacağını görürsünüz. (Hibernate 3.6'yı kullanarak burada, belki 4.x ile daha iyi çalışır?) –