Hibernate - Как использовать перечисление в качестве ключа карты - PullRequest
0 голосов
/ 13 октября 2009

Моя сущность определяет поле как

Map<String, String> props;

У меня есть эта конфигурация xibernate 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;

Я думаю, мне нужно создать собственный Hibernate UserType для MyEnum, а затем сослаться на это из hbm.xml ...
Есть ли у вас какие-либо идеи о том, как лучше / проще всего этого добиться?
Большое спасибо

Ответы [ 2 ]

2 голосов
/ 13 октября 2009

Hibernate уже имеет тип Enum . Это часть дистрибутива Hibernate Annotations, а не Hibernate Core, однако вы можете использовать его с сопоставлениями XML, указав тип явно:

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

Я не пытался указать Enum в качестве ключа карты, если честно - я не понимаю, почему он не будет работать, но документация Hibernate говорит, что ключ карты может быть "базовым" введите, и возможно, что EnumType не будет квалифицироваться.

Обратите внимание, однако, что ваша Карта НЕ будет EnumMap при загрузке из базы данных. Hibernate возвращает коллекции в виде своих собственных типов, которые реализовали соответствующие интерфейсы (например, Map / Set / List ...). Если для вас очень важно иметь свою Карту в качестве EnumMap (чего не должно быть - кроме незначительного улучшения производительности, то не должно быть никакой разницы), чем вам придется писать собственный тип - для самой Карты, а не для Enum. Это довольно сложно, потому что для коллекций это должно быть разыменовано в запросах - я бы настоятельно рекомендовал не идти по этому пути.

0 голосов
/ 12 ноября 2015

Попробуйте @ MapKeyEnumerated аннотация.

...