NHibernatemany-to-many
の関係は、私たちが期待するものを提供します。それについて詳しく説明します。UserとGroupの2つのエンティティのみが必要ですが、3つのテーブルが必要になります:User
、、(列はUserId、GroupId)Group
UserGroup
C#エンティティ:
public class User {
IList<Group> Groups {get;set;}
}
public class Group{
IList<User> Users{get;set;}
}
hbm.xmlマッピングは次のようになります。
<class name="User" ...
<bag name="Groups" lazy="true"
table="UserGroup" cascade="none" >
<key column="UserId" />
<many-to-many class="Group" column="GroupId" />
</bag>
...
<!-- and group vica versa -->
<class name="Group" ...
<bag name="Users" lazy="true"
table="UserGroup" cascade="none" >
<key column="GroupId" />
<many-to-many class="User" column="UserId" />
</bag>
...
重要な設定を使用したこのマッピングは、cascade="none"
期待される動作を実行します。このマッピングは、エンティティ表現を持たないPairTableがあることを示しています。 UserGroup
したがって、このテーブルに影響を与えるカスケード設定はありません。このテーブルは、舞台裏で隠されて使用されます。
ペアテーブル
一部のユーザーが削除されると、NHibernateはテーブルからすべてのリレーションも削除しUserGroup
ます(実際、これはバッチの最初のステートメントになります)。これは、リレーショナル参照制約の処理にすぎません。テーブルに外部キーがないUserId
テーブルには、何も残せません。UserGroups
User
もう一方の関係の終わり
最後に、カスケード設定:UserGroup
テーブルは注意を払わずに管理されるため、この場合、カスケードはエンティティGroup
(もう一方のリレーションエンド)に適用されます。したがって、all-delete-orphanに設定すると、相互参照されたすべてのレコードが完全に削除される可能性があります。
概要:bag
withmany-to-many
リレーションのカスケードは、ペアリングテーブルではなく、もう一方のエンドポイントを対象としています。