Что означают REFRESH и MERGE с точки зрения баз данных?

94

Мне любопытно, и мне нужно быстро найти этот ответ. Google мало чем поможет.

У Java Persistence API есть следующие свойства, которые сообщают фреймворку каскадные операции над ассоциированными объектами:

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

Я знаю, что означают первые два: когда я сохраняю объект A, у которого есть B, также сохраняю B, а когда я удаляю A, удаляю также B.

Но я не могу понять, что делают двое других. Помогите?

Андре Чалелла
источник

Ответы:

80

REFRESH означает «переносить любые изменения состояния из базы данных в мое представление». Каскадирование это просто; это означает, что все связанные объекты обновлены.

MERGE означает что-то сложное, что примерно соответствует «сохранению», но больше похоже на «вернуть этот отдельный объект обратно в управляемый статус и сохранить изменения его состояния»; каскадирование означает, что все связанные объекты возвращаются одинаково, а дескриптор управляемого объекта, от которого вы возвращаетесь, .merge()имеет все связанные с ним управляемые объекты.

Ссылка на один экземпляр соответствующих документов

хаос
источник
1
Что такое значение по умолчанию (если мы не задавали CascadeType) и какой наиболее разумный / общий для установки?
Rosdi Kasim
@Rosdi Kasim: По CascadeTypeумолчанию используется пустой массив.
user1438038
@chaos so refresh обновляет дочерние элементы в соответствии с тем, что находится в базе данных, когда родитель обновляется / обновляется. Слияние по существу перезапишет обновленные поля в дочерних элементах в базе данных, чтобы отразить дочерние сущности с родительскими. Итак, если используются оба, что произойдет? Полагаю, я неправильно это понял.
Jordan Mackie
87

Значение аннотации JPA для отношений "многие ко многим" :

  • ВСЕ - все возможные каскадные операции, выполняемые над исходной сущностью, каскадируются к цели ассоциации.
  • MERGE - если исходная сущность объединена, слияние каскадно передается в цель ассоциации.
  • PERSIST - если исходная сущность сохраняется, сохранение передается каскадно к цели ассоциации.
  • REFRESH - если исходная сущность обновляется, обновление каскадно передается в цель ассоциации.
  • УДАЛИТЬ - при удалении исходной сущности удаляется и цель ассоциации.

Я сам их так вижу (более читабельно):

  • MERGE - для существующих объектов объединить существующие данные в таблице с данными в моем объекте. (синхронизировать с базой данных)
  • PERSIST - создание новых записей из объекта в базе данных.
  • REFRESH - обновить данные в объекте. Возможно, в базе данных произошли изменения, которые необходимо синхронизировать. (синхронизация из базы данных)
  • REMOVE - это, ну, удалить.
cgp
источник
1
Javadoc для аннотаций мне ничего не прояснил. Спасибо за ответ!
Андре Чалелла,