我有以下类,我想使用NHibernate
进行映射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;}
}
在数据库(Oracle)UserId的UserPassword表中,Password和CreateDtm是一个复合键(我无法更改)
目前我的映射文件看起来像
<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)
我错过了复合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”以删除从集合中删除的项目。