2010-04-29 19 views
6

que tienen un 'perro' Entitiy con un @Id y una @TableGeneratorAPP @TableGenerator compartida entre múltiples entidades

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

¿Hay una manera de reutilizar el mismo generador de tablas (dog_gen) en otra entidad? Quiero seguir la misma secuencia id en dos entidades independientes, digo

perro = 1, perro = 2, perro = 3, cat = 4, cat = 5, perro = 6 etc. ...

Ambas entidades no comparten una superclase común para implementar algún tipo de herencia con la propiedad id.

Si añado el @GeneratedValue (generador = "dog_gen") en mi entidad gato, omitiendo la declaración @TableGenerator se emite una excepción diciendo que no puede encontrar el generador cuando a partir del contexto.

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) 

Respuesta

3

De hecho, y esto no es lo que esperaba después de leer el javadoc de @TableGenerator:

Esta anotación define un generador de clave principal que puede ser referenciado por su nombre cuando se especifica un elemento generador para el GeneratedValue anotación. Se puede especificar un generador de tabla en la clase de entidad o en el campo o propiedad de clave principal. El alcance del nombre del generador es global para la unidad de persistencia (en todos los tipos de generador).

Tal vez no estoy interpretando las cosas correctamente (la sección 1.9.38 de la especificación JPA no nos dice más) pero yo estaba esperando para poder hacer referencia a un nombre de generador de otra entidad en el @GeneratedValue.

De todos modos, lo siguiente parece funcionar. En el Dog entidad:

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

Y en el Cat, así, la misma:

@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

lo probé ... Parece que funciona sólo por el tamaño de asignación es 1. Pero en realidad generadores independientes se crean y trabajan por separado. Si elige un tamaño de asignación mayor que 1, verá que tendrá diferentes rangos de id para cada entidad. (Usando Hibernate 3.6 aquí, ¿tal vez funciona mejor con 4.x?) –

Cuestiones relacionadas