代码之家  ›  专栏  ›  技术社区  ›  Quillion

在hibernate中读取和写入泛型枚举

  •  1
  • Quillion  · 技术社区  · 8 年前

    我有和包含字段的对象

    @Column(name = "section", nullable = false)
    @Enumerated(EnumType.STRING)
    private Enum section;
    

    Caused by: java.lang.IllegalArgumentException: Unknown name value [BLAH] for enum class [java.lang.Enum]
    

    这当然很有道理。那么,有什么方法可以指定每个项目的值将指向哪个枚举?

    1 回复  |  直到 8 年前
        1
  •  2
  •   VGR    7 年前

    您应该在每个项目中分别定义每个枚举属性。

    最好的方法是从当前类中删除枚举属性,用 @Embeddable 而不是 @Entity

    您还可以从当前类中删除枚举,使类抽象,替换 @实体 具有 @MappedSuperclass ,并让每个项目声明其子类,该子类声明特定于项目的枚举。然而,与继承设计相比,最好选择聚合设计。

    如果您需要多态性,也就是说,您需要能够从一段代码中通用地引用每个项目实体。您可以让每个项目实体类实现一个接口:

    public interface Sectionable<E extends Enum<E>> {
        E getSection();
        void setSection(E value);
    }
    
    @Entity
    public class Project1Entity
    implements Sectionable<Section1> {
        @Embedded
        private ProjectData data = new ProjectData();
    
        @Column(name = "section", nullable = false)
        @Enumerated(EnumType.STRING)
        private Section1 section;
    
        public ProjectData getData() {
            return data;
        }
    
        public void setData(ProjectData newData) {
            Objects.requireNonNull(newData, "Data cannot be null");
            this.data = newData;
        }
    
        @Override
        public Section1 getSection() {
            return section;
        }
    
        @Override
        public void setSection(Section1 section) {
            Objects.requireNonNull(section, "Section cannot be null");
            this.section = section;
        }
    }