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