java - JPA @TableGenerator shared between multiple entities -
i have 'dog' entitiy @id , @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 way reuse same table generator (dog_gen) in other entity? want keep same id sequence in 2 independent entities, say
dog=1, dog=2, dog=3, cat=4, cat=5, dog=6 , on...
both entities don't share common superclass implement kind of inheritance id property.
if add @generatedvalue( generator="dog_gen") on cat entity, omitting @tablegenerator declaration throws exception saying can't find generator when starting context.
caused by: org.hibernate.annotationexception: unknown id.generator: dog_gen @ org.hibernate.cfg.binderhelper.makeidgenerator(binderhelper.java:413) @ org.hibernate.cfg.annotationbinder.bindid(annotationbinder.java:1795) @ org.hibernate.cfg.annotationbinder.processelementannotations(annotationbinder.java:1229) @ org.hibernate.cfg.annotationbinder.bindclass(annotationbinder.java:733) @ org.hibernate.cfg.annotationconfiguration.processartifactsoftype(annotationconfiguration.java:498) @ org.hibernate.cfg.annotationconfiguration.secondpasscompile(annotationconfiguration.java:277)
indeed , not expecting after reading javadoc of @tablegenerator
:
this annotation defines primary key generator may referenced name when generator element specified
generatedvalue
annotation. table generator may specified on entity class or on primary key field or property. the scope of generator name global persistence unit (across generator types).
maybe i'm not interpreting things correctly (the section 9.1.38 of jpa spec doesn't tell more) expecting able reference generator name entity in @generatedvalue
.
anyway, following seems work. in dog
entity:
@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, same:
@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;
Comments
Post a Comment