在休眠中读写通用枚举
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在休眠中读写通用枚举相关的知识,希望对你有一定的参考价值。
我有和包含字段的对象
@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]
这当然是完全合理的。那么有什么方法可以指定每个项目的值将指向哪个Enum?
答案
您应该在每个项目中单独定义每个枚举属性。
最好的方法是从当前类中删除enum属性,使用@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;
}
}
以上是关于在休眠中读写通用枚举的主要内容,如果未能解决你的问题,请参考以下文章