所以我有一些代表歌曲元数据的代码,而不是为每个字段设置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,
....
}
答案 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
类,其中SongFieldKey
为enumClass
参数,12
为{{1}参数。 (魔术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>
代码中假设没有使用SongField
类型,因此我的地图在代码中显示如下:<element>
。)
无论如何,请务必了解此解决方案的效率并查看以下内容:
希望这会有所帮助。使用Hibernate 3.4和MySQL5 db。