2012-08-26 188 views
0

我有以下類,我想在數據庫(Oracle)的用戶ID,密碼使用NHibernateNHibernate的映射子複合鍵

class User 
{ 
    long Id {get; set;} 
    IList<UserPassword> OldPasswords {get; set} 
} 

class UserPassword 
{ 
    long UserId {get; set;} 
    string Password {get; set;} 
    DateTime CreateDtm {get; set;} 
} 

在userPassword表來映射和CreateDtm是複合鍵(I但是不能改變這一點)

目前我的映射文件看起來像

<hibernate-mapping assembly="DomainEntities" namespace="DomainEntities.Models" xmlns="urn:nhibernate-mapping-2.2"> 

    <class name="User" table="USERS" lazy="true" > 
    <id name="Id"> 
     <column name="USER_ID" sql-type="NUMBER" not-null="true" unique="true"/> 
     <generator class="identity"/> 
    </id> 

    <bag name="OldPasswords" cascade="all" inverse="true"> 
     <key column="USER_ID" not-null="true" /> 
     <one-to-many class="UserPassword" /> 
    </bag> 

    </class> 
</hibernate-mapping> 

<hibernate-mapping assembly="DomainEntities" namespace="DomainEntities.Models" xmlns="urn:nhibernate-mapping-2.2"> 

    <class name="UserPassword" table="USER_PASSWORDS" lazy="true" > 

    <composite-id> 
     <key-property name="UserId" column="USER_ID" /> 
     <key-property name="Password" column="OLD_PASSWORD" /> 
     <key-property name="CreateDtm" column="CREATE_DATE" /> 
    </composite-id> 

    </class> 

</hibernate-mapping> 

當用戶對象,它的加載查詢用戶的密碼正確,我不能添加或刪除一個新的密碼到列表中。

我已經嘗試添加User對象上的映射,但是當嘗試提交事務時,它在CreateDtm的無效數組索引上引發異常。我懷疑這是因爲組合鍵。

我是否在我的映射中缺少某些東西,或者這是一個無法完成的情景?

+0

嘗試在關聯 –

+0

上使用'inverse =「false」'爲什麼要將UserPassword映射爲實體?您可以簡單地將它映射爲用戶組件,然後組合ID消失 – Firo

+0

我需要1-M關係 - 我沒有意識到我可以使用組件對此進行建模。 – AndrewK

回答

0

我錯過了組合ID中的標籤。

複合-ID現在看起來像

<composite-id> 
    <key-many-to-one name="User" column="USER_ID" lazy="proxy" class="User" /> 
    <key-property name="Password" column="OLD_PASSWORD" /> 
    <key-property name="CreateDtm" column="CREATE_DATE" /> 
</composite-id> 

另一部分對這個問題,是級聯模式,父。我需要將cascade設置爲「add-delete-orphan」來刪除從集合中刪除的項目。