Как использовать каскад и инверсию в спящем режиме? Какая процедура / тег для их определения? Связаны ли они друг с другом и чем они полезны?
В чем разница между каскадом и инверсией в спящем режиме, для чего они используются?
Ответы (3)
В случае отношения "многие ко многим" через промежуточную таблицу; «Каскад» указывает, будет ли создана / обновлена запись в дочерней таблице. В то время как «Обратный» говорит, будет ли запись создаваться / обновляться в промежуточной таблице.
например Предположим, что в приведенном ниже сценарии 1 студент может иметь несколько телефонов. Итак, у студенческого класса есть свойство Набор телефонов. Также 1 телефон может принадлежать нескольким студентам. Итак, у класса Phone есть свойство Set of Students. Это отображение упоминается в таблице stud_phone.
Итак, есть три таблицы, а именно. Таблица "Студент", "Телефон" и "Stud_phone" (посредник). Отображение может выглядеть так:
<set name="phoneset" table="stud_phone" cascade="save-update" inverse="true">
<key column="mapping_stud_id">< /key>
<many-to-many class="com.domain.Phone" column="mapping_phon_id"/>
</set>
Создается новый объект "Студент", и к его набору добавляются 2 новых объекта "Телефон". И session.save(student_obj)
называется. В зависимости от настроек «каскад» и «обратный» будут запускаться разные запросы.
Ниже представлены различные комбинации каскада и инверсии и их влияние.
1) КАСКАД НЕТ, а ОБРАТНЫЙ - ложь.
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
2) КАСКАД - НЕТ, а ИНВЕРС - истина.
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
3) КАСКАД - это сохранение-обновление, а ИНВЕРС - ложь.
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
4) CASCADE - это сохранение-обновление, а INVERSE - истина.
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Как видно, только при сохранении-обновлении CASCADE записи были созданы и в таблице PHONE. Иначе нет.
Когда INVERSE был ложным (т.е.Студент был владельцем отношения), промежуточная таблица STUD_PHONE была обновлена. Когда инверсия истинна, телефон является владельцем отношения, поэтому, несмотря на то, что был создан новый ученик, промежуточная таблица не обновлялась.
Таким образом, в случае связи двух сущностей «каскад» влияет на другую таблицу сущностей, а «обратный» влияет на промежуточную таблицу. Так что их эффект независим.
Информация, взятая из Различия между каскадной и обратной ссылкой:
1. инверсия: используется, чтобы решить, какая сторона является владельцем отношения, чтобы управлять отношениями (вставка или обновление столбца внешнего ключа).
2. каскад: в каскаде после выполнения одной операции (сохранение, обновление и удаление) он решает, нужно ли вызывать другие операции (сохранение, обновление и удаление) для других сущностей, которые связаны друг с другом.
Вывод: Короче говоря, «обратный» решает, какая сторона будет обновлять внешний ключ, а «каскад» решает, какую операцию следует выполнить. Оба выглядят очень похожими в отношениях, но это совершенно разные вещи. Разработчикам Hibernate стоит потратить время на его изучение, потому что неправильное понимание концепции или неправильное ее использование приведет к серьезным проблемам с производительностью или целостностью данных в их приложении.
Также проверьте эту тему форума: https://forum.hibernate.org/viewtopic.php?f=1&t=949041
Это ортогональные понятия.
В ассоциациях одна из сторон должна быть помечена как обратная с помощью атрибута inverse
или mappedBy
(сторона many
в ассоциации one-to-many
/ many-to-one
и любая сторона в ассоциации many-to-many
). Эта информация необходима для Hibernate, чтобы правильно определить, как классы Java (объектно-ориентированная ассоциация) будут отображаться в таблицы базы данных (реляционная ассоциация).
Что насчет каскадирования - вы можете явно указать, чтобы Hibernate выполнял операции со связанными объектами:
CascadeType.PERSIST
- Когдаsave()
илиpersist()
вызывается для владельца, все связанные сущности также сохраняются;CascadeType.REMOVE
- Когдаdelete()
вызывается для владельца, все связанные сущности также удаляются;CascadeType.MERGE
- Когдаmerge()
вызывается для владельца, все связанные сущности также объединяются в управляемое / постоянное состояние;CascadeType.REFRESH
- Когдаrefresh()
вызывается для владельца, все связанные сущности также обновляются из своего представления в базе данных;CascadeType.DETACH
- Когда сессия, с которой была связана эта сущность, закрывается, все связанные сущности будут в отключенном состоянии;CascadeType.ALL
- включает все каскадные операции;- «удаление сироты» - удаляет связанный объект из базы данных, когда этот объект удаляется из отношения.