问题
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?
回答1:
Here is what the JPA 1.0 spec says about the SequenceGenerator
annotation:
9.1.37 SequenceGenerator Annotation
The
SequenceGenerator
annotation defines a primary key generator that may be referenced by name when a generator element is specified for theGeneratedValue
annotation. A sequence generator may be specified on the entity class or on the primary key field or property. The scope of the generator name is global to the persistence unit (across all generator types).
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 the SequenceGenerator
on the sub classes.
回答2:
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:
@MappedSuperclass
public abstract class BaseEntity {
@Id
@SequenceGenerator(name = "seqGenerator", sequenceName = "DICTIONARY_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqGenerator")
private Long id;
}
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Intermed extends BaseEntity {}
@Entity
public class MyEntity1 extends Intermed {}
@Entity
public class MyEntity2 extends Intermed {}
While doing things this way seems remarkably stupid (at least to me) it does work.
来源:https://stackoverflow.com/questions/3607691/sequencegenerator-on-class-annotated-with-mappedsuperclass