Каскадирование в (N) Hibernate, какие правила мне нужны? - PullRequest
1 голос
/ 24 августа 2009

Извините, если это дурак, не смог его найти, но все равно не знал, что искать ...

У меня есть три класса, Parent, Child и Other

Parent имеет множество Child, где ребенок имеет столбец Parent_Id

Other содержит ссылку на Child через Child_Id столбец

Когда я удаляю Parent, я также хочу удалить все связанные Child объекты. Если на эти Child объекты ссылаются какие-либо классы Other, я хочу, чтобы их (Other объекты) Child_Id ссылки были аннулированы.

Какие каскадные правила мне нужны для двух отношений?

Кроме того, будет ли NHibernate обновлять сущности как в памяти, так и в базе данных?

т.е. если у меня в памяти будет куча Parent, Child и Other (то есть загружена из базы данных, не преходящая) и скажу NH удалить Parent, что будет? Я предполагаю, что объекты Parent и Child станут временными? Что будет со свойством Child любых Other объектов?

Редактировать: при использовании All-Delete-Orphan, что классифицирует объект как сироту? В приведенном выше примере является ли Child сиротой, если ее родитель Parent удален? Имеет ли значение ссылка Other при рассмотрении объекта как сироты?

Спасибо

1 Ответ

1 голос
/ 24 августа 2009

NH не обновляет ни одну из ваших сущностей в памяти (кроме идентификаторов и версий). NH не несет ответственности за управление отношениями с вами. Он просто сохраняет то, что вы сделали в памяти для базы данных.

С этой точки зрения это должно стать легче для понимания.

cascade="delete" означает, что когда родитель удаляется, ребенок также удаляется. cascade="delete-orphan" означает, что, кроме того, дочерний элемент даже удаляется, если на него больше не ссылается ни один из родителей. Это, конечно, работает, только если ребенок находится на сессии.

Удаленный экземпляр становится временным в памяти. Ссылки на временный экземпляр (от Other) вызовут исключение. AFAIK, вам нужно удалить ссылку на удаленные экземпляры самостоятельно. Вы, вероятно, можете сделать это неявным путем с помощью некоторых уловок, но я сомневаюсь, что это будет чисто. Это бизнес логика.

Для отношений родитель-ребенок cascade="all-delete-orphan" подходит.

Для регулярных ссылок я предпочитаю cascade="none".

Айенде Рахьен есть великое объяснение

...