Hibernate - 如何使用枚举作为Map的键

时间:2009-10-13 15:31:57

标签: xml hibernate map key enumeration

我的实体定义了一个像

这样的字段
Map<String, String> props;

我有这个hibernate xml配置

<map name="props" table="PROPS">  
    <key column="id"/>  
    <index column="name" type="string"/>  
    <element column="value" type="string"/>  
</map>

现在我希望我的地图成为像

这样的EnumMap
Map<MyEnum, String> props;

我想我需要为MyEnum创建自己的Hibernate UserType,然后从hbm.xml引用它...
您是否知道实现这一目标的最佳/最简单方法是什么? 非常感谢

2 个答案:

答案 0 :(得分:2)

Hibernate已经有Enum类型。它是Hibernate Annotations发行版的一部分而不是Hibernate Core,但是你可以通过明确指定类型来使用XML映射:

<property name="myEnum" type="org.hibernate.type.EnumType"/>

我没有尝试将Enum指定为地图密钥,说实话 - 我不明白为什么它不起作用,但是Hibernate documentation说地图密钥可以是“基本”类型而且它是可能EnumType不符合条件。

但请注意,从数据库加载地图时,您的地图不会是 EnumMap 。 Hibernate将集合作为自己的类型返回,实现相应的接口(例如Map / Set / List ...)。如果您将Map作为EnumMap(它不应该是 - 除了轻微的性能改进之外应该没有区别)至关重要,那么您必须为Map本身而不是Enum编写自定义类型。这很难,因为对于集合而言,它必须在查询中可以解除引用 - 我强烈建议不要走这条路。

答案 1 :(得分:0)

尝试@MapKeyEnumerated注释。