映射实现接口的Enum类型的集合

时间:2011-04-28 22:43:14

标签: hibernate jpa hibernate-annotations

我有一个棘手的事情,我正试图用枚举来存储静态数据。

它从声明为这样的枚举类开始:

interface MyInterface {
    String getName();
}

public enum A implements MyInterface {
FIRST_A("First A");
private final String name;
private A(String name) {
this.name = name;
}
public String getName() {
return name;
}

public String toString() {
return name;
}
}

public enum B implements MyInterface {
FIRST_B("First B");
private final String name;
private B(String name) {
this.name = name;
}
public String getName() {
return name;
}

public String toString() {
return name;
}
}

现在我想将它们用作:

List<MyInterface> elements

问题在于映射集合。如果我使用CompositeUserType来编写枚举的枚举类以及使用EnumType.STRING持久保存@Enumerated的String值,我可以正常地保持这些正常。在这些情况下,我可以声明:


@Type(type="MyCustomEnumType.class")
@Columns(columns = {
            @Column(name = "enumValue"), @Column(name = "enumClass")
})
private Enum enumValue;

在这种情况下,我可以很好地坚持它们,但是我不确定在集合上使用@Type是否会使该集合中的所有项目都使用该自定义类型。我是否应该使用@ElementCollection,因为它是可嵌入的?或者我使用我编写的用户类型类作为集合的targetClass?关于它是如何工作的,我有点困惑。我想保持它的通用性足以在集合中持久存在A或B(尽管它最终只是每个实体持久存在一种类型,但也可能是)。

我不希望将它设置为Entity类,因为它是不会改变的静态数据,但将来可能会有一个新版本,最终会成为另一个枚举。

1 个答案:

答案 0 :(得分:1)

Hibernate不支持开箱即用,但您可以编写自己的usertype来存储完全限定的枚举名称,例如com.package.Type.ENUM_VALUE。我不知道用户类型是否可用于将一个值/对象映射到多个数据库列。

有一个用于存储枚举的usertype的示例here。该示例仅存储枚举,但您可以将其用作模板。