Прежде всего, Hibernate позволяет отображать Map
s, Entity Map
a и Collections
простых типов данных и классов.
Вы бы сделали это так (для Map<String, String>
):
<map name="songFields">
<key column="id"/>
<index column="name" type="string"/>
<element column="songField" type="string"/>
</map>
С такой записью в вашем hbm.xml
все значения, которые вы поместите на карту, будут сохранены во вновь созданной таблице с именем songFields
.
Итак, в худшем случае ваш пример мог бы работать, если бы вы заменили enum набором статических String
полей (что, я полагаю, вы не хотите делать, не так ли?
Когда вы пытаетесь заменить string
типом Enum
, отображение не будет работать из коробки. Что вам нужно сделать, так это как-то сопоставить ваш класс Enum
с полем varchar
в БД.
Это способ, которым вы можете это сделать.
Во-первых, в вашем файле *.hbm.xml
определите новый тип класса org.hibernate.type.EnumType
, указав SongFieldKey
в качестве параметра enumClass
и 12
в качестве type
. (Магия 12
определяется в java.sql.Type
как VARCHAR
.)
<hibernate-mapping>
<typedef name="songFieldKey" class="org.hibernate.type.EnumType">
<param name="enumClass">org.nowaq.hql.enums.SongFieldKey</param>
<param name="type">12</param>
</typedef>
...
</hibernate-mapping>
Если у вас есть это, вы можете написать <map ...
, заменив string
на songFieldKey
, например:
<map name="songFields">
<key column="id"/>
<index column="fieldId" type="songFieldKey"/>
<element column="field" type="string"/>
</map>
Это должно решить вашу проблему "нет получателей и установщиков". (Я предполагал, что для простоты в теге <element>
не используется тип SongField
, поэтому моя карта выглядела так в коде: private EnumMap<SongFieldKey, String> fields;
.)
В любом случае, убедитесь, что поняли эффективность этого решения и взгляните на эти:
Надеюсь, это поможет. Работал с Hibernate 3.4 и MySQL5 db.