I have following structure of my entities:
@MappedSuperclass
public abstract class BaseEntity {
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqGenerator")
private Long id;
}
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@SequenceGenerator(name = "seqGenerator", sequenceName = "DICTIONARY_SEQ")
public abstract class Intermed extends BaseEntity {}
@Entity
public class MyEntity1 extends Intermed {}
@Entity
public class MyEntity2 extends Intermed {}
And I got following exception:
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'sessionFactory' defined in class path resource [context/applicationContext.xml]:
Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Unknown Id.generator: seqGenerator
When I change @MappedSuperclass to @Entity on Intermed class, everything works OK. Are there any problems with using @MappedSuperclass and @SequenceGenerator? Or I have missed something?
I ran into the same problem described in this question while trying to achieve application wide id generators.
The solution is actually in the first answer: put the sequence generator on the primary key field.
Like so:
While doing things this way seems remarkably stupid (at least to me) it does work.
Here is what the JPA 1.0 spec says about the
SequenceGenerator
annotation:And a mapped superclass is not an entity. So according to the way I read the spec, what you want to do is not possible. Either make the
Intermed
class an entity or put theSequenceGenerator
on the sub classes.