Понимание разницы между Persist() и Merge() в JPA и Hibernate
В JPA и Hibernate методы persist() и merge () методы играют решающую роль в управлении сущностями и обеспечении устойчивости данных. Однако они имеют явные различия в поведении.
Persist()
Метод persist(), как определено спецификацией JPA, работает следующим образом:
- Если объект новый и неуправляемый, он становится управляемым и будет сохранен в базе данных при фиксации или очистке транзакции.
- Если объект уже находится под управлением или удален, операция игнорируется.
- Если объект отсоединен, может быть выдано исключение или операция сохранения может завершиться неудачно во время сброса или фиксации.
- Каскадные операции применяются к любым объектам, на которые ссылаются, с cascade=PERSIST или cascade=ALL аннотации.
Merge()
С другой стороны, метод merge() имеет другой набор семантики:
- Если объект отсоединен, его состояние копируется в уже существующий управляемый объект с тем же идентификатором или создается новая управляемая копия.
- Если объект новый , создается новый управляемый объект, и его состояние копируется из входящего объекта.
- Если объект удаляется, создается исключение.
- Если объект является управляемым, операция игнорируется , но каскадные операции по-прежнему применяются к объектам, на которые имеются ссылки, если они аннотированы с помощью cascade=MERGE или cascade=ALL.
- Объединенный объект ссылается на управляемые объекты для всех связей, аннотированных с помощью cascade=MERGE или cascade=ALL.
- Если сущность объединяется со ссылкой на некаскадную связь, ассоциация из объединенной сущности вернет ссылку на управляемый объект с тем же идентификатором.
Когда использовать Persist() или Merge()
Основываясь на этих различиях, следующие рекомендации помогут вам выбрать подходящий метод:
- Используйте persist(), когда захотите. для создания нового или обновления существующего объекта, который еще не управляется контекстом персистентности.
- Используйте merge(), если вы хотите обновить существующий объект, который уже управляется, но был изменен вне контекста персистентности. .