JPA - 保存更改而不调用persist()

时间:2009-11-23 18:15:37

标签: jpa toplink-essentials persist

我们正在使用JPA + Spring + EJB的Toplink实现。在我们的一个EJB中,我们有类似的东西:

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

因此,基本上这个updateUser方法应该更新给定id的用户名。 但是这个方法的作者忘了调用em.persist(u);

最奇怪的是,它运作正常。怎么会这样?我百分百肯定 在不调用em.persist()或em.merge()的情况下,无法将更改保存到数据库中。他们可以吗?有可能发生这种情况吗?

由于

1 个答案:

答案 0 :(得分:12)

您正在使用托管实体。如果实体由于其实体管理器已关闭而未分离,则在刷新/关闭会话并提交事务时,对实体所做的所有更改都会反映到数据库中。

来自Java EE tutorial

  

持久性实体的状态是   同步到数据库的时候   实体所在的交易   相关提交。

编辑以获得清晰度和解释:因此,实体在其生命周期中可能存在三种不同的模式:

  • 未保存:实体已实例化,但尚未调用persist()
  • 托管:实体已使用persist()保留,或从数据库加载,并与实体管理器会话关联。在刷新实体管理器会话时,对实体的所有更改都会反映到数据库中。
  • 分离:实体的实体经理会话已关闭。对实体的更改不会自动反映到数据库中,但可以使用merge()命令显式合并。