【问题标题】:Read and Write generic Enum in hibernate在休眠中读写通用枚举
【发布时间】:2018-04-24 04:41:24
【问题描述】:

我有一个包含字段的对象

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

这样做的原因是因为该对象正在三个不同的项目中使用,并且每个项目都将提供自己的 Enum。好像写对象很容易,但是看不下去了,继续弄

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

这当然是完全合理的。那么有什么方法可以指定每个项目的值将指向哪个枚举?

【问题讨论】:

  • 这是否意味着您将拥有三个不同的项目连接到同一个数据库?
  • 他们不会连接到同一个数据库。父类只有对象,子类将连接到那里定义的数据库。

标签: java mysql hibernate enums hibernate-mapping


【解决方案1】:

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

最好的方法是从当前类中删除枚举属性,用@Embeddable而不是@Entity注释该类,并在每个项目中创建一个嵌入它的实体类,并声明它自己的项目特定枚举属性。

您还可以从当前类中删除枚举,使类抽象,将@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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多