Мы используем реализацию Toplink JPA + Spring + EJB. В одном из наших EJBs мы имеем что-то вроде этого:JPA - сохранение изменений без persist() invoked
public void updateUser(long userId, String newName){
User u = em.get(User.class, userId);
u.setName(newName);
// no persist is invoked here
}
Таким образом, в основном этот метод updateUser предполагается обновить имя пользователя с заданным идентификатором. Но автор этого метода забыл вызвать em.persist (u);
И самое странное, что все работает нормально. Как это может быть? Я был на 100% уверен, что без вызова em.persist() или em.merge() не может быть внесены изменения в базу данных. Могут ли они? Есть ли сценарий, когда это может произойти?
Thanks
Спасибо. Это очень помогло! Я всегда думал, что требуется вызов em.persist(), даже если объект связан с текущим EntityManager. – anthony
Weird: В моей настройке у меня есть ссылка на управляемый объект. Затем я изменяю состояние этого объекта. Затем я вызываю 'entityManager.flush()'. В случае, если это выполняется в транзакции, тогда состояние изменения сущности ** записывается ** в базу данных. В случае, если это выполняется без транзакции, тогда измененное состояние объекта ** не записывается ** в базу данных. Так выглядит следующее утверждение: * «Всегда необходимо совершить транзакцию или вызов' entityManager.persist (obj) ', чтобы записать последнее состояние« obj »в базу данных.» * .... (Я использую JPA 2.0 с Hibernate (4.1.7.Final)) – Abdull
@Abdull, да, спецификация JPA не определяет никакого поведения autocommit, поэтому вам нужна текущая транзакция или вообще ничего не записывается в базу данных. – Henning