2011-11-30 33 views
2

因此,我有一些代表歌曲元數據的代碼,而不是每個字段的getter和setter,我把值放在map中,每個字段都是一個String,而且我有爲每個字段單獨枚舉。這使得代碼很多簡單使用Hibernate和表格的屬性

林現在希望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

你有一個表格來存儲** SongFieldKey **中的所有條目嗎? – ManuPK

+0

@ManuPK不,我不要 –

回答

1

所有的Hibernate首先讓你map Map s,Entity Map a和Collections的簡單數據類型和類。在hbm.xml

<map name="songFields"> 
    <key column="id"/> 
    <index column="name" type="string"/> 
    <element column="songField" type="string"/> 
</map> 

有了這樣的條目,則您將放在地圖將被存儲在新創建的表稱爲songFields值:

你會做這樣的(爲Map<String, String>) 。

因此,在最壞的情況下,如果你更換了一組靜態String領域的枚舉的例子可以工作(我假設你不想做,你呢?:-))

當您嘗試使用Enum類型替換string,映射將無法使用。你需要做的是以某種方式將你的Enum類映射到DB中的varchar字段。

這是如何做到這一點。

首先,在你*.hbm.xml文件中定義一個新的類型org.hibernate.type.EnumType類與SongFieldKey作爲enumClass參數和12作爲type參數。 (魔術12java.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 ...songFieldKey更換string這樣的:

<map name="songFields"> 
    <key column="id"/> 
    <index column="fieldId" type="songFieldKey"/> 
    <element column="field" type="string"/> 
</map> 

這應該解決你的「不吸氣和安裝員」問題。 (我假設沒有SongField型的使用在<element>標籤簡單,所以我的地圖看上去像這樣的代碼:private EnumMap<SongFieldKey, String> fields;

無論如何,一定要了解這個解決方案的效率,並採取一起來看看這些:

希望這有助於。使用Hibernate 3.4和MySQL5 db。

+0

謝謝,我會研究它 –