0

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)のUserPasswordテーブルでは、UserId、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 の無効な配列インデックスで例外がスローされました。これは複合キーが原因だと思います。

マッピングに欠けているものがありますか?それとも、これは実行できないシナリオですか?

4

1 に答える 1

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> 

この問題の他の部分は、親のカスケードモードでした。コレクションから削除されたアイテムを削除するには、カスケードを「add-delete-orphan」に設定する必要がありました。

于 2012-08-28T23:20:30.477 に答える