2010-04-29 5 views
6

J'ai un « chien » entitiy avec un @Id et un @TableGeneratorJPA @TableGenerator partagé entre plusieurs entités

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

Est-il possible de réutiliser le même générateur de table (dog_gen) dans une autre entité? Je veux garder la même séquence id dans deux entités indépendantes, dire

chien = 1, chien = 2, chien = 3, cat = 4, cat = 5, chien = 6 et ainsi de suite ...

Les deux entités ne partagent pas une super-classe commune pour implémenter une sorte d'héritage avec la propriété id.

Si j'ajoute le @GeneratedValue (générateur = « dog_gen ») sur mon entité chat, en omettant la déclaration @TableGenerator renvoie une exception en disant qu'il ne peut pas trouver le générateur lors du démarrage du contexte.

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) 

Répondre

3

En effet, ce n'est pas ce que j'attendais après avoir lu la javadoc de @TableGenerator:

Cette annotation définit un générateur de clé primaire qui peut être référencée par son nom lorsqu'un élément générateur est spécifié pour la GeneratedValue annotation. Un générateur de table peut être spécifié sur la classe d'entité ou sur le champ ou la propriété de clé primaire. La portée du nom du générateur est globale à l'unité de persistance (pour tous les types de générateurs).

Peut-être que je ne suis pas interpréter correctement les choses (la section 9.1.38 de la spécification JPA ne nous dit pas plus) mais je me attendais à être en mesure de faire référence à un nom de générateur d'une autre entité dans le @GeneratedValue.

Quoi qu'il en soit, ce qui suit semble fonctionner. Dans l'entité 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; 

Et dans le Cat, eh bien, la même chose:

@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

Je l'ai essayé ... il semble fonctionner seulement parce que la taille d'allocation est 1. Mais les générateurs effectivement séparés sont créés et travaillent séparément. Si vous choisissez une taille d'allocation supérieure à 1, vous verrez que vous aurez des plages d'identifiants différentes pour chaque entité. (En utilisant Hibernate 3.6 ici, peut-être que ça marche mieux avec 4.x?) –

Questions connexes