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

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

Ответы [ 3 ]

85 голосов
/ 28 января 2012

В случае отношения «многие ко многим» через промежуточную таблицу;«Каскад» говорит, будет ли запись / создаваться в дочерней таблице.Принимая во внимание, что «Инверсия» указывает, будет ли запись / обновляться в промежуточной таблице

. Например, предположим, что по сценарию 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) CASCADE IS NONE и INVERSE - false

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) CASCADE - НЕТ, а INVERSE - true

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)

3) CASCADE - сохранение-обновление, а INVERSE - false

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 - это truesave-update и INVERSE true

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

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

26 голосов
/ 08 сентября 2010

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

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

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

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

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

3 голосов
/ 11 ноября 2018

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

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