2010-02-11 45 views
1

我有一個實體,我想通過Hibernate持久化(3.2) EntityBean有一個列,指示另一個值實體bean應解組:表中的Hibernate Reference列指示如何在同一個表中的不同列中解組一個屬性

<class name="ServiceAttributeValue" table="service_attribute_value"> 
     <cache usage="nonstrict-read-write"/> 
     <id name="id" column="id" type="int-long"> 
     <generator class="native"/> 
     </id> 
     <property name="serviceAttribute" type="service-attribute" column="service_attribute" not-null="true" /> 
     <!-- order is important here --> 
     <property name="value" type="attribute-value" not-null="true"> 
     <column name="service_attribute" /> 
     <column name="id_value"/> 
     <column name="enum_value"/> 
     <column name="string_value"/> 
     <column name="int_value"/> 
     <column name="boolean_value"/> 
     <column name="double_value"/> 
     </property> 
    </class> 

的「service_attribute」列指示尋找它的「值」屬性欄的時候解組值的和,更重要的是,到底是什麼類型的值應該是,例如,如果要讀取enum_value,則爲Enum類;如果要讀取id_value,則爲Bean的類型。

value屬性使用自定義CompositeUserType做解組,並在此我想不過來引用service_attribute列(雖然不寫入),當我嘗試這樣做,我得到以下錯誤:

org.hibernate.MappingException: Repeated column in mapping for entity: com.precurse.apps.rank.model.service.ServiceAttributeValue column: service_attribute (should be mapped with insert="false" update="false") 

但是在複合屬性的定義中,這些xml屬性沒有被定義(只在一個正常的屬性中)。

有沒有人知道克服這種方式,或者如果有更好的解決方案這個問題。

如果您需要了解更多信息,請讓我知道,

乾杯 西蒙

回答

0

根據您的描述,好像你想要做的就是創建一個基於該service_attribute不同的子類的東西。不要嘗試實現不允許在休眠狀態下重複的列映射,您可以看看hibernate inheritance mapping

+0

Hi Hsiu, 感謝您回覆帖子。我想要做的是*避免*你有一個繼承層次結構。 每個服務*理論上可以是主服務類的一個子類,所以我可以有一個保險服務,金融服務,園藝服務等。 因爲他們有這麼多可能的服務,並且因爲(在這個領域至少)他們是非常簡單的名稱值類型結構我試圖避免有這樣的結構,因爲 a。它需要編程開銷 b。服務的行爲真的非常有限,而且只是數據持有者。 – 2010-02-12 01:51:43

0

我想我找到了一個解決方案,儘管不是一個非常優雅的。

在CompositeUserType的

public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) 
     throws HibernateException, SQLException { 

法「所有者」的說法傳遞給方法

包含誰的service_attribute我要訪問的對象的ID。

令人討厭的是,所有者的實際服務屬性在此階段不可訪問或尚未設置(我在hbm.xml配置文件中對元素進行了排序,如果這是排序的事情,但仍然不幸沒有喜悅),所以我不能簡單地訪問它。

無論如何設置所有者對象的ID,所以我然後使用會話參數來運行基於id的HQL查詢來訪問serviceAttribute,然後我用它來正確解組值value屬性。

該解決方案的缺點是它需要一個HQL查詢作爲解組過程的開銷,儘管它在同一個會話中仍然不是最優的。

如果有人有任何更好的解決方案的想法,我會非常感激。

乾杯

1

我有一個類似的問題,改變一列的情況下,解決了這個問題。可以試一試!
例如,一列可以是service_attribute其他Service_Attribute。

+0

好吧,這是一個好主意,我會看看它是否有效,謝謝你的回覆。 – 2010-02-12 08:55:02

1

你可以試試這個。不是將兩個值都映射爲同一個表上的屬性,而是使用連接將其中一個屬性映射到自身,並按照原樣保留其他屬性。這種情況下,您將能夠在兩個地方訪問相同的屬性。請記住將該物業命名爲不同的名稱。

 <join table="service_attribute_value"> 
     <key column = "id" /> 
     <property name="serviceAttribute" type="service-attribute" column="service_attribute" not-null="true" /> 
     </join> 

     <!-- order is important here --> 
     <property name="value" type="attribute-value" not-null="true"> 
     <column name="service_attribute" /> 
     <column name="id_value"/> 
     <column name="enum_value"/> 
     <column name="string_value"/> 
     <column name="int_value"/> 
     <column name="boolean_value"/> 
     <column name="double_value"/> 
     </property> 
相關問題