2011-04-28 126 views
4

我有一个棘手的事情,我试图映射与枚举存储静态数据。实现接口的枚举类型映射集合

一开始是宣布为枚举类:

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所产生的字符串值,我可以正常地坚持这些。在这种情况下,我可以声明:


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

在这种情况下,我能坚持他们就好了,但我不确定如果在收集使用@Type将使该集合内的所有物品一直存在使用自定义类型。我是否也应该使用@ElementCollection,因为它是可嵌入的?或者,我是否使用我编写的用户类型类作为集合的targetClass?我对它是如何工作的有点困惑。我想保持它的通用性,足以在集合中保存A或B(尽管它最终只会保持一种类型,但可以是两者之一)。

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

+0

JPA不支持 DataNucleus 2011-04-29 07:20:26

回答

1

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

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

+1

我已经写了一个正是这么做的接口字段或收藏,但我试图把它一步,有一个声明,他们现在都延长一个接口集合甚至只是Enum 。我遇到的问题是弄清楚如何使集合使用我的自定义类型来存储枚举。我不确定是否要添加@Type来使用我的自定义类型,或者是否需要使用@ElementCollection的targetClass做些什么。 – kjordan 2011-04-29 01:06:40