Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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