Що означають REFRESH та MERGE з точки зору баз даних?


93

Мені цікаво, і мені потрібно швидко знайти цю відповідь. Google не дуже допоможе.

API персистенції Java має такі властивості, які вказують фреймворку на каскадні операції з асоційованими сутностями:

CascadeType.PERSIST
CascadeType.DELETE
CascadeType.MERGE
CascadeType.REFRESH

Я знаю, що означають перші два: коли я зберігаю об'єкт A, який має B, зберігаю також B, а коли я видаляю A, видаляю B також.

Але я не можу зрозуміти, що роблять інші двоє. Допомога?

Відповіді:


79

REFRESH означає "втягнути будь-які зміни стану з бази даних у моє представлення". Каскадувати це просто; це означає, що всі асоційовані сутності оновлені.

MERGE означає щось складне, що приблизно відповідає "зберегти", але більше нагадує "повернути цю відокремлену сутність назад у керований статус і зберегти зміни стану"; каскадне означає, що всі асоційовані сутності повертаються однаково, а дескриптор керованої сутності, з якого ви повертаєтесь.merge() має всі асоційовані сутності, пов'язані з ним.

Посилання на один екземпляр відповідних документів


Що є за замовчуванням (якщо ми не встановили жодного CascadeType), і що є найбільш розумним / загальним для встановлення?
Rosdi Kasim

@Rosdi Kasim: За CascadeTypeзамовчуванням порожній масив.
user1438038

@chaos тому оновіть оновлення дітей відповідно до того, що є в базі даних, коли батьківське оновлення / оновлення. Злиття по суті перезапише оновлені поля в дочірніх базах даних, щоб відобразити дочірні сутності з батьком. Отже, якщо використовуються обидва, що відбувається? Думаю, я це неправильно зрозумів.
Джордан Макі

87

Анотація JPA Значення для стосунків "Багато до багатьох" :

  • ALL - усі можливі каскадні операції, що виконуються над вихідною сутністю, каскадуються до цілі асоціації.
  • MERGE - якщо об’єднана вихідна сутність, злиття каскадується до цілі асоціації.
  • PERSIST - якщо вихідна сутність зберігається, persist каскадується до цілі асоціації.
  • REFRESH - якщо сутність джерела оновлюється, оновлення каскадується до цілі асоціації.
  • ВИДАЛИТИ - якщо видалено вихідну сутність, цільову асоціацію також видалено.

Я сам бачу їх таким чином (більш читабельним):

  • MERGE - для існуючих об'єктів, щоб об'єднати наявні дані в таблиці з даними в моєму об'єкті. (синхронізувати з базою даних)
  • PERSIST - це створення нових записів з об'єкта в базі даних.
  • REFRESH - це оновлення даних в об’єкті. Можливо, в базі даних відбулися зміни, які потрібно синхронізувати. (синхронізація з бази даних)
  • REMOVE - це, ну, видалити.

1
Javadoc для анотацій для мене нічого не зрозумів. Дякую за відповідь!
Андре Шалелла
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.