Ответ 1
В случае отношения "многие ко многим" через промежуточную таблицу; "Каскад" говорит, будет ли запись/обновление записи в дочерней таблице. В то время как "Инверс" говорит, будет ли запись создана или обновлена в промежуточной таблице
например. Предположим ниже сценарий 1 студент может иметь несколько телефонов. Итак, у класса Student есть свойство для набора телефонов. Также 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>
Создан новый объект-ученик и добавлены два новых объекта телефона. И вызывается session.save(student_obj)
.
В зависимости от "каскадных" и "обратных" настроек будут запущены различные запросы.
Ниже приведены различные комбинации каскада и инверсии и их влияние.
1) CASCADE IS NONE и INVERSE являются ложными
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 NONE и INVERSE истинно
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 - это обновление сохранения и 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 было ложным (т.е. Student был владельцем отношения), была обновлена промежуточная таблица STUD_PHONE. Когда inverse истинно, Phone является владельцем отношений, поэтому, несмотря на то, что был создан новый ученик, таблица-посредник не обновлялась.
Таким образом, в случае отношения двух объектов "каскад" влияет на другую таблицу сущностей, а "обратная" влияет на промежуточную таблицу. Таким образом, их эффект независим.