我在服务类下面的代码: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