В чем разница между каскадом и инверсией в спящем режиме, для чего они используются?

Как использовать каскад и инверсию в спящем режиме? Какая процедура / тег для их определения? Связаны ли они друг с другом и чем они полезны?


person Chandra Sekhar    schedule 08.09.2010    source источник
comment
Поиск в Google обратного каскада гибернации принес this в качестве третьего результата.   -  person Péter Török    schedule 08.09.2010
comment
хммм, я не заметил, что вы уже ссылались на ту же ссылку.   -  person YoK    schedule 08.09.2010
comment
Я и @ArunKumar считаем, что ответ Кошика Леле следует пометить как принятый.   -  person TechSpellBound    schedule 11.10.2013


Ответы (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 была обновлена. Когда инверсия истинна, телефон является владельцем отношения, поэтому, несмотря на то, что был создан новый ученик, промежуточная таблица не обновлялась.

Таким образом, в случае связи двух сущностей «каскад» влияет на другую таблицу сущностей, а «обратный» влияет на промежуточную таблицу. Так что их эффект независим.

person Kaushik Lele    schedule 28.01.2012
comment
У меня есть одно сомнение: когда inverse = false означает, что Студент является владельцем отношений, то есть Студент является родителем. Итак, если мы обновим таблицу учеников, тогда Телефон (Дочерняя таблица) обновится автоматически. но, когда inverse = true, Phone является владельцем отношения, то есть Phone является родительским. Итак, если мы обновим телефонную таблицу, тогда таблица учеников получит обновление или нет ??? пожалуйста, объясните этот сценарий - person Sumit Kandoi; 17.07.2016
comment
@SumitKandoi, как объясняется в ответе, решает каскадная настройка. Так что обратные настройки значения не имеют. - person Kaushik Lele; 19.07.2016

Информация, взятая из Различия между каскадной и обратной ссылкой:

1. инверсия: используется, чтобы решить, какая сторона является владельцем отношения, чтобы управлять отношениями (вставка или обновление столбца внешнего ключа).

2. каскад: в каскаде после выполнения одной операции (сохранение, обновление и удаление) он решает, нужно ли вызывать другие операции (сохранение, обновление и удаление) для других сущностей, которые связаны друг с другом.

Вывод: Короче говоря, «обратный» решает, какая сторона будет обновлять внешний ключ, а «каскад» решает, какую операцию следует выполнить. Оба выглядят очень похожими в отношениях, но это совершенно разные вещи. Разработчикам Hibernate стоит потратить время на его изучение, потому что неправильное понимание концепции или неправильное ее использование приведет к серьезным проблемам с производительностью или целостностью данных в их приложении.

Также проверьте эту тему форума: https://forum.hibernate.org/viewtopic.php?f=1&t=949041

person YoK    schedule 08.09.2010

Это ортогональные понятия.

В ассоциациях одна из сторон должна быть помечена как обратная с помощью атрибута 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 - включает все каскадные операции;
  • «удаление сироты» - удаляет связанный объект из базы данных, когда этот объект удаляется из отношения.
person Community    schedule 11.11.2018