使用Hibernate和地图属性的地图

时间:2011-11-30 12:36:26

标签: hibernate

所以我有一些代表歌曲元数据的代码,而不是为每个字段设置getter和setter,我将值放在map中,每个字段都是一个String,每个字段都有一个单独的枚举。这使得代码更简单

我现在正在寻找hibernatise这个代码,我将失去这种简单性,并且必须为每个字段设置getter和setter

public class Song
{

    protected final EnumMap<SongFieldKey,SongField> fields = new EnumMap<SongFieldKey,SongField>(SongFieldKey.class);


    public Song()
    {

    }


    /**
     * Return table cell datatype
     */
    public final SongField getField(SongFieldKey field)
    {
        return fields.get(field);
    }


    ................
}

public enum SongFieldKey
{
    ALBUM,
    ALBUM_ARTIST,
    ALBUM_ARTIST_SORT,
    ALBUM_SORT,
    AMAZON_ID,
    ARRANGER,
    ARTIST,
    ....
}

1 个答案:

答案 0 :(得分:1)

首先,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的表格中。

所以,在最坏的情况下,如果你用一组静态String字段替换enum,你的例子可以工作(我假设你不想这样做,是吗?: - ))

当您尝试使用string类型替换Enum时,映射无法开箱即用。您需要做的是以某种方式将您的Enum班级映射到数据库中的varchar字段。

这就是你如何做到的。

首先,在您的*.hbm.xml文件中定义一种新的org.hibernate.type.EnumType类,其中SongFieldKeyenumClass参数,12为{{1}参数。 (魔术type12中定义为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> 代码中假设没有使用SongField类型,因此我的地图在代码中显示如下:<element>。)

无论如何,请务必了解此解决方案的效率并查看以下内容:

希望这会有所帮助。使用Hibernate 3.4和MySQL5 db。