gpt4 book ai didi

java - 在 hibernate 中读写通用枚举

转载 作者:行者123 更新时间:2023-11-29 05:58:27 25 4
gpt4 key购买 nike

我有一个包含字段的对象

@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]

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

最佳答案

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

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

您还可以从当前类中删除枚举,使类抽象,将 @Entity 替换为 @MappedSuperclass,并让每个项目声明它的一个子类声明一个特定于项目的枚举。但是,最好总是选择聚合设计而不是继承设计。

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

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;
}
}

关于java - 在 hibernate 中读写通用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47231466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com