SINGLE_TABLE inheritance strategy using enums as discriminator value

前端 未结 7 1977
谎友^
谎友^ 2020-12-15 15:31

Is it possible to use an enum as a discriminator value when using SINGLE_TABLE inheritance strategy?

7条回答
  •  春和景丽
    2020-12-15 16:23

    I just wanted to improve the great answer of @asa about the workaround. Usually, we often like to use the discriminator column as an attribute of the abstract class, and mapped with an enum of course. We can still use the solution mentioned above and force some consistencies between enum names (used to map the column) and String values (used as discrimnator values). Here is my suggestion:

    public enum ELanguage {
      JAVA(Values.JAVA), GROOVY(Values.GROOVY);
    
      private ELanguage (String val) {
         // force equality between name of enum instance, and value of constant
         if (!this.name().equals(val))
            throw new IllegalArgumentException("Incorrect use of ELanguage");
      }
    
      public static class Values {
         public static final String JAVA= "JAVA";
         public static final String GROOVY= "GROOVY";
      }
    }
    

    And for the entities, here is the code:

    @Entity
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="LANGUAGE_TYPE", discriminatorType=DiscriminatorType.STRING)    
    public abstract class Snippet {
       // update/insert is managed by discriminator mechanics
       @Column(name = "LANGUAGE_TYPE", nullable = false, insertable = false, updatable = false) 
       @Enumerated(EnumType.STRING)
       public ELanguage languageType
    }
    
    @Entity
    @DiscriminatorValue(value=ELanguage.Values.JAVA)
    public class JavaSnippet extends Snippet {
        …
    }
    

    Still not perfect, but a little bit better, I think.

提交回复
热议问题