JPA - сохранение изменений без сохраняется () вызванный

Мы используем реализацию Toplink JPA + Spring + EJB. В одном из наших EJBs у нас есть что-то вроде этого:

public void updateUser(long userId, String newName){
    User u = em.get(User.class, userId);
    u.setName(newName);
    // no persist is invoked here
}

Так, в основном это updateUser() метод, как предполагается, обновляет имя пользователя с данным userId. Но автор этого метода забыл вызывать em.persist(u).

И самая странная вещь состоит в том, что это хорошо работает. Как это может быть? Я был на 100% уверен это без вызова em.persist() или em.merge() нет никакого способа, которым изменения, возможно, были сохранены в базу данных. Могли они? Есть ли какой-либо сценарий, когда это могло произойти?

10
задан Alexander Pozdneev 8 November 2019 в 10:47
поделиться

1 ответ

Вы работаете с управляемым объектом. Если объект не отсоединяется из-за того, что его диспетчер объектов закрыт, все изменения, внесенные в объект, отражаются в базе данных, когда сеанс сбрасывается / закрывается и транзакция фиксируется.

Из руководства Java EE ]:

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

Редактировать для ясности и объяснения : Таким образом, существует три различных режима, в которых объект может находиться в течение своего жизненного цикла:

  • Несохраненный : объект был создан, но сохраняется () еще не был вызван.
  • Управляемый : сущность сохранена с помощью persist () или загружена из базы данных и связана с сеансом диспетчера сущностей. Все изменения объекта отражаются в базе данных при сбросе сеанса диспетчера объектов.
  • Отсоединен : сеанс диспетчера объектов был закрыт. Изменения объекта не будут отражены в базе данных автоматически, но могут быть объединены явно с помощью команды merge () .
12
ответ дан 4 December 2019 в 00:25
поделиться
Другие вопросы по тегам:

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