Как использовать каскад и инвертировать в спящем режиме? Какова процедура/тег для их определения? Связаны ли они друг с другом и как они полезны?
В чем разница между каскадом и инверсией в спящем режиме, для чего они используются?
Ответ 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 является владельцем отношений, поэтому, несмотря на то, что был создан новый ученик, таблица-посредник не обновлялась.
Таким образом, в случае отношения двух объектов "каскад" влияет на другую таблицу сущностей, а "обратная" влияет на промежуточную таблицу. Таким образом, их эффект независим.
Ответ 2
Информация, на которую ссылается Различие между каскадным и обратным:
1. inverse: Это используется, чтобы решить, какая сторона является владельцем отношений для управления отношениями (вставить или обновление столбца внешнего ключа).
2. каскад: В каскаде после одной операции (сохранение, обновление и удаление) он будет решать, нужно ли вызывать другие операции (сохранить, обновить и удалить) на других объектах, которые имеет отношения друг с другом.
Вывод: Короче говоря, "обратный" решает, какая сторона обновит внешний ключ, в то время как "каскад" решает Что следует за операцией выполнить. Оба выглядят очень похожими в отношениях, но его полностью два разные вещи. Разработчики Hibernate стоит потратить время на исследования это, потому что непонимание концепции или злоупотребление им, приведет к серьезным производительности или целостности данных в их применение.
Также посмотрите эту тему в форуме: https://forum.hibernate.org/viewtopic.php?f=1&t=949041