JPA EntityManager: Зачем использовать persist () вместо merge ()?

Создайте собственный заголовок unistd.h и включите необходимые заголовки для прототипов функций.

908
задан Harshal Patil 27 January 2016 в 07:39
поделиться

1 ответ

В любом случае сущность будет добавлена ​​в PersistenceContext, разница в том, что вы делаете с этой сущностью впоследствии.

Persist берет экземпляр сущности, добавляет его в контекст и делает этот экземпляр управляемым (т.е. будущие обновления сущности будут отслеживаться).

Слияние создает новый экземпляр вашей сущности, копирует состояние из предоставленной сущности , и делает новую копию управляемой. Экземпляр, который вы передаете, не будет управляться (любые внесенные вами изменения не будут частью транзакции - если вы снова не вызовете слияние).

Может быть, поможет пример кода.

MyEntity e = new MyEntity();

// scenario 1
// tran starts
em.persist(e); 
e.setSomeField(someValue); 
// tran ends, and the row for someField is updated in the database

// scenario 2
// tran starts
e = new MyEntity();
em.merge(e);
e.setSomeField(anotherValue); 
// tran ends but the row for someField is not updated in the database
// (you made the changes *after* merging)

// scenario 3
// tran starts
e = new MyEntity();
MyEntity e2 = em.merge(e);
e2.setSomeField(anotherValue); 
// tran ends and the row for someField is updated
// (the changes were made to e2, not e)

Сценарии 1 и 3 примерно эквивалентны, но есть некоторые ситуации, когда вы захотите использовать сценарий 2.

1589
ответ дан 19 December 2019 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: