ドキュメントから直接。これはあなたの問題を正確に説明しています:
ただし、このコード
Parent p = (Parent) session.Load(typeof(Parent), pid);
// Get one child out of the set
IEnumerator childEnumerator = p.Children.GetEnumerator();
childEnumerator.MoveNext();
Child c = (Child) childEnumerator.Current;
p.Children.Remove(c);
c.Parent = null;
session.Flush();
データベースから c を削除しません。p へのリンクを削除するだけです (この場合、NOT NULL 制約違反が発生します)。Child を明示的に Delete() する必要があります。
Parent p = (Parent) session.Load(typeof(Parent), pid);
// Get one child out of the set
IEnumerator childEnumerator = p.Children.GetEnumerator();
childEnumerator.MoveNext();
Child c = (Child) childEnumerator.Current;
p.Children.Remove(c);
session.Delete(c);
session.Flush();
さて、私たちの場合、子はその親なしでは実際には存在できません。したがって、Child をコレクションから削除する場合は、本当に削除したいと考えています。このためには、cascade="all-delete-orphan" を使用する必要があります。
<set name="Children" inverse="true" cascade="all-delete-orphan">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
編集:
逆のものに関しては、これはSQLの生成方法を決定するだけだと思います。詳細については、このドキュメントを参照してください。
注意すべきことの1つは、持っていますか
not-null="true"
休止状態の構成での多対 1 の関係について?