2011-05-18 27 views
0

我們遇到了使用property-ref進行一對多映射的問題。我們正在得到一個ClassCastException,因爲property-ref列的類型與PK的類型不同。它看起來是一個來自Google的已知問題。任何有關解決方法的洞察或更好的方式來做這個映射將不勝感激。無法使用property-ref進行一對多映射替代鍵

背景:

  • 3表帳戶,用戶,UserAccount;用戶和賬戶之間的一對多關係
  • 聯接表UserAccount具有用戶的完整主鍵和帳戶主鍵的一部分。
  • User-to-UserAccount的一對多映射,按預期工作
  • Property-ref屬性用於對UserAccount和Account之間的關係建模。
  • 發現以下JIRA的bug,這表明其他人都遇到同樣的問題與物業-REF:http://opensource.atlassian.com/projects/hibernate/browse/HHH-2052

我使用下面的映射文件。
帳戶

<class name="com.model.Account" table="Account"> 
    <composite-id class="com.model.VersionId" 
     mapped="false" name="id"> 
     <key-property column="entity_id" name="entityId" type="java.lang.Long" /> 
     <key-property column="entity_vers" name="version" type="java.lang.Long" /> 
    </composite-id> 
    <property column="entity_id" name="entityId" 
     type="java.lang.Long" insert="false" update="false" /> 

    <set name="userAccounts" cascade="none"> 
     <key column="entity_id" property-ref="entityId"/> 
     <many-to-many class="com.model.UserAccount" column="acct_entity_id" property-ref="accountId"/> 
    </set> 
</class> 

用戶

<class name="com.model.User" table="User"> 
    <composite-id class="com.model.VersionId" 
     mapped="false" name="id"> 
     <key-property column="entity_id" name="entityId" type="java.lang.Long" /> 
     <key-property column="entity_vers" name="version" type="java.lang.Long" /> 
    </composite-id> 
    <property column="user_name" length="255" name="name" 
     type="java.lang.String" /> 

    <set name="userAccounts" table="UserAccount"> 
     <key> 
      <column name="entity_id" /> 
      <column name="entity_vers" /> 
     </key> 
     <one-to-many class="com.model.UserAccount" /> 
    </set> 

</class> 

UserAccount

<class name="com.model.UserAccount" 
    table="UserAccount"> 
     <composite-id class="com.model.UserAccountId" 
     mapped="false" name="id"> 
     <key-property column="entity_id" name="userId" type="java.lang.Long" /> 
     <key-property column="acct_entity_id" name="accountId" 
      type="java.lang.Long" /> 
     <key-property column="entity_vers" name="userVersion" 
      type="java.lang.Long" /> 
    </composite-id> 

    <property column="acct_entity_id" name="accountId" 
      type="java.lang.Long" insert="false" update="false"></property> 

     <many-to-one name="user" 
     class="com.model.User" insert="false" 
     update="false"> 
     <column name="entity_id" /> 
     <column name="entity_vers" /> 
    </many-to-one> 

    <set name="accounts" cascade="none"> 
     <key column="acct_entity_id" property-ref="acountId"/> 
     <many-to-many class="com.model.Account" column="entity_id" property-ref="entityId"/> 
    </set> 
</class> 

感謝

回答

1

對於任何一誰是有興趣,我能夠通過使用單向單來解決這個從用戶到Acc的多對多映射'mount與用戶以下映射佔

<set name="accounts" table="UserAccounts"> 
     <key> 
      <column name="entity_id" /> 
      <column name="entity_vers" /> 
     </key> 
     <many-to-many column="acct_entity_id" property-ref="entityId" unique="true" class="com.model.Account" /> 
    </set> 

我已經能夠成功地測試了這一點,萬一別人已經使用遺留數據庫的工作,今後這樣的問題。

一些評論: 使用unique =「true」,您可以使用多對多映射,您必須使用一對多映射。這對我來說很重要,因爲我需要能夠在映射中使用property-ref,而不是一對多通過休眠DTD。

參考: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/associations.html#assoc-unidirectional-join-12m