@SequenceGenerator on class annotated with @MappedSuperclass

前端 未结 2 1657
情话喂你
情话喂你 2021-02-08 03:38

I have following structure of my entities:

@MappedSuperclass
public abstract class BaseEntity {
  @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generat         


        
相关标签:
2条回答
  • 2021-02-08 04:06

    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.

    0 讨论(0)
  • 2021-02-08 04:11

    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 the GeneratedValue 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.

    0 讨论(0)
提交回复
热议问题