NHibernate Save-Update
применяется как к UPDATE
, так и к INSERT
операторам SQL.
Параметры каскада относятся к тому, что NHibernate должен делать с другими связанными объектами при сохранении объекта. Как пишет Айенде в этом посте
- Нет - не делайте никаких каскадов, пусть пользователи обрабатывают их самостоятельно.
- Save-Update - когда объект сохраняется / обновляется, проверяйте ассоциации и сохраняйте / обновляйте любой объект, который требует его (включая сохранение / обновление ассоциаций в сценарии "многие ко многим").
- Удалить - при удалении объекта удаляются все объекты в ассоциации.
- Delete-Orphan - при удалении объекта удаляются все объекты в ассоциации. В дополнение к этому, когда объект удаляется из ассоциации и не связан с другим объектом (осиротевшим), также удаляйте его.
- Все - при сохранении / обновлении / удалении объекта проверьте ассоциации и сохраните / обновите / удалите все найденные объекты.
- All-Delete-Orphan - когда объект сохраняется / обновляется / удаляется, проверяйте ассоциации и сохраняйте / обновляйте / удаляйте все найденные объекты. В дополнение к этому, когда объект удаляется из ассоциации и не связан с другим объектом (осиротевшим), также удаляйте его.
Итак, Save-Update в основном говорит NHibernate: «При сохранении моей сущности, если какие-либо объекты, связанные с этой сущностью, являются временными (еще не сохранены), сохраните их (сохраните)». Все связанные объекты, которые уже являются постоянными, будут обновлены.
Причина, по которой он называется Save-Update
, может заключаться в том, что он применяется к Save()
, Update()
и SaveOrUpdate()
В документации Фабио Мауло по NHibernate , Глава 9.9 рассказывает о графах LifeStyles и Object * :
NHibernate не полностью реализует «постоянство по достижимости»,
что подразумевает (неэффективный) постоянный сбор мусора.
Тем не менее, из-за широкого спроса, NHibernate поддерживает понятие
объекты становятся постоянными, когда на них ссылается другой постоянный
объект. Ассоциации, помеченные как cascade = "save-update", ведут себя таким образом.
Если вы хотите использовать этот подход во всем приложении, это
проще указать атрибут default-cascade для
элемент.