JPA @TableGenerator is split between multiple objects

I have an Entitiy "dog" with @Id and @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 another object? I want to keep the same identification sequence in two independent entities, say

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

Both objects do not have a common superclass to implement any inheritance with the id property.

If I add @GeneratedValue (generator = "dog_gen") to my cat object, omitting the @TableGenerator declaration, you will get an exception message that the generator cannot find when the context starts.

 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) 
+6
java orm hibernate jpa
source share
1 answer

Indeed, this is not what I expected after reading javadoc @TableGenerator :

This annotation defines a primary key generator that can be referenced by name when a generator element is specified for the GeneratedValue annotate. A table generator can be specified in an entity class or in a field or property of a primary key. The scope of the generator name is global for the storage unit (for all types of generators).

Maybe I'm not interpreting correctly (section 9.1.38 of the JPA specification does not tell us anymore), but I expected that I could reference the generator name from another Entity in @GeneratedValue .

In any case, it seems to work. In the Dog object:

 @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 Cat , well, the same thing:

 @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; 
+3
source share

All Articles