Вопрос о спящем отображении, где поведение неоднозначно и / или опасно. У меня есть отношение один ко многим, у которого есть условие cascade-delete-orphan И условие where для ограничения элементов в коллекции. Отображение здесь -
<hibernate-mapping>
<class name="User" table="user" >
<!-- properties and id ... -->
<set table="email" inverse="true" cascade="all,delete-orphan" where="deleted!=true">
<key column="user_id">
<one-to-many class="Email"/>
</set>
</class>
</hibernate-mapping>
Теперь предположим, что у меня есть объект User, связанный с одним или несколькими объектами электронной почты, по крайней мере один из которых имеет значение 'true' для свойства удалено . Что из следующих двух произойдет, когда я вызову session.delete () для объекта User?
- Пользователь и все объекты электронной почты, включая объекты с удаленным = true, удаляются
- Объекты User и Email, которые были удалены! = Null, удаляются.
С одной стороны, сценарий 1) игнорирует условие where, которое может быть неправильным в соответствии с моделью предметной области. НО в сценарии 2) если родитель удаляется, и существует ограничение внешнего ключа на ключ соединения дочерней (электронной) таблицы, то команда удаления завершится неудачно. Что происходит и почему? Это просто еще один пример того, как функции Hibernate могут быть неоднозначными?