我在服務類下面的代碼: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」)調用不會真的改變任何內容。查找調用後,在em.merge(e);返回的實體中檢查實體中的值。對於調試,您也可以在合併調用之前嘗試em.find調用並檢查返回的對象中的值 - 如果對象已經存在,則不應該改變任何內容,因爲EclipseLink在內部也會執行相同的操作。 – Chris