У меня есть следующий код в классе обслуживания:JPA: слияние и сохранение контекста
public void updateEntity(Entity e){
EntityManager em=entityManagerFactory.createEntityManager();
em.getTransaction().begin();
em.merge(e);
em.getTransaction().commit();
em.close();
}
public Entity readEntity(int id){
EntityManager em=entityManagerFactory.createEntityManager();
Entity result=em.find(Entity.class, id);
em.close();
return result;
}
Пожалуйста, обратите внимание, что в обеих функциях менеджера сущностей (контекст инерционности, как я понимаю) закрыт.
Так что, когда я делаю:
Entity entity=service.readEntity(100);
entity.setXxx("lalala");
service.updateEntity(entity);
Все работает как надо, и я вижу в журнале, который сгенерировал SQL изменений только одно поле. Но когда я делаю:
Entity entity=new Entity(100);
entity.setXxx("lalala");
service.updateEntity(entity);
изменения не записываются в базу данных. Пожалуйста, объясните, почему. Я использую EclipseLink.
Используйте em.persist, когда у вас есть новый объект. –
Если вы запустили код из своего первого теста перед вторым, тогда вызов setXxx («lalala») ничего не изменит. Проверьте значения в вашем объекте после вызова find и в объекте, который возвращается из em.merge (e) ;. Для отладки вы также можете попробовать вызов em.find перед вызовом слияния и проверить значения в возвращаемом объекте - он не должен ничего менять, если объект уже существует, так как EclipseLink будет делать то же самое в любом случае. – Chris