Hibernate: как замэпить Map с ключами - Enum?

  • Автор темы Dymytry
  • Дата начала
D

Dymytry

#1
День добрый!

Ситуация следующая: надо замэпить через XML-мэппинг аттрибут класса вида:
Код:
Map<MY_ENUM, SomeClass> myMap = new HashMap<MY_ENUM, SomeClass>();
Мой путь был таков: сначала я попробовал реализовать упрощенный случай: Map<KeyClass, Integer> через
Код:
<map name="myMap" cascade="all">
<key column="parent_id"/>
<map-key-many-to-many class="system.KeyClass" />
<element column="my_integer" type="integer" />
</map>
И это сработало кроме одной непонятной мне детали: если не сохранять (if not persist) объекты-ключи KeyClass ДО сохранения всего Entity, то вылезет ошибка
object references an unsaved transient instance - save the transient instance before flushing: system.KeyClass
Чтобы убрать ее приходится вручную перед сохранением объекта-держателя Map сохранять объекты-ключи этой Map. Мне непонятно с чем это связано: мне казалось Hibernate всегда автоматом сохраняет все зависимости если я поставил cascade="all".

Ну ладно, я продолжил и теперь пробую сохранить Map, где ключом является Enum:
Код:
<class name="EntityClass">
(...)
<map name="myMap" cascade="all">
<key column="parent_id"/>
<map-key-many-to-many class="MY_ENUM" />
<one-to-many class="SomeClass" />
</map>
</class>
<class name="MY_ENUM">
<id name="id" type="int">
<generator class="native"/>
</id>
<property name="name" type="string" length="32"/>
</class>
И это работает, но странность в том что в соотв. таблице SomeClass, там где должен быть индекс в виде id инстанса MY_ENUM содержится вместо этого некий BLOB! Соврешенно неясно откуда он взялся и как побороть.

Да, я слышал про то что Enums должны мэпиться неким спец-типом, но мне неясно как применить это к моему случаю енума-ключа в Map:
Код:
<property name="status" not-null="true">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">MY_ENUM</param>
</type>
</property>

?
 

Kmet

Java Team
25.05.2006
1 036
8
#2
можешь показать, что за ДБ модель ты пытаешься замапить?