【问题标题】:Mapping Collection of Enum types that implement interface实现接口的枚举类型的映射集合
【发布时间】:2011-04-28 22:43:14
【问题描述】:

我正在尝试使用 Enums 映射以存储静态数据。

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

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

问题在于映射集合。如果我使用为编写要持久化的枚举的类以及通过使用 EnumType.STRING 持久化 @Enumerated 所产生的字符串值而编写的 CompositeUserType,我可以正常地持久化这些。在这些情况下,我可以声明:


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

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

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

【问题讨论】:

  • JPA 不支持接口字段或集合

标签: hibernate jpa hibernate-annotations


【解决方案1】:

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

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

【讨论】:

  • 我已经写了一个完全可以做到这一点的,但我试图更进一步,并有一个集合,该集合使用它们正在扩展的接口或什至只是 Enum >。我遇到的问题是弄清楚如何让 Collection 使用我的自定义类型来存储枚举。我不确定是否添加 @Type 以使用我的自定义类型,或者我是否需要对 @ElementCollection 的 targetClass 做一些事情。
猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多