在休眠中读写通用枚举
Read and Write generic Enum in hibernate
我有一个包含字段的对象
@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]
这当然很有道理。那么有什么方法可以指定每个项目的值将指向哪个枚举?
您应该在每个项目中分别定义每个枚举 属性。
最好的方法是从当前 class 中删除枚举 属性,将 class 注释为 @Embeddable
而不是 @Entity
,并在每个项目,创建一个嵌入它的实体 class 并声明其自己的项目特定枚举 属性.
您还可以从当前 class 中删除枚举,使 class 抽象,将 @Entity
替换为 @MappedSuperclass
,并让每个项目声明一个子class 其中声明了一个特定于项目的枚举。但是,总比继承设计更喜欢聚合设计。
如果您需要多态性——也就是说,您需要能够从一段代码中通用地引用每个项目的实体——您可以让每个项目的实体 class 实现一个接口:
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;
}
}
我有一个包含字段的对象
@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]
这当然很有道理。那么有什么方法可以指定每个项目的值将指向哪个枚举?
您应该在每个项目中分别定义每个枚举 属性。
最好的方法是从当前 class 中删除枚举 属性,将 class 注释为 @Embeddable
而不是 @Entity
,并在每个项目,创建一个嵌入它的实体 class 并声明其自己的项目特定枚举 属性.
您还可以从当前 class 中删除枚举,使 class 抽象,将 @Entity
替换为 @MappedSuperclass
,并让每个项目声明一个子class 其中声明了一个特定于项目的枚举。但是,总比继承设计更喜欢聚合设计。
如果您需要多态性——也就是说,您需要能够从一段代码中通用地引用每个项目的实体——您可以让每个项目的实体 class 实现一个接口:
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;
}
}