Прямо из документации . Это объясняет вашу проблему именно так, как я считаю:
Однако этот код
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). Вам нужно явно удалить () ребенка.
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, для получения дополнительной информации см. doc .
Стоит отметить, у вас есть
not-null="true"
в отношении многие-к-одному в вашей конфигурации hibernate?