15

我们正在使用 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()方法应该用给定的userId. 但是这个方法的作者忘记调用了em.persist(u)

最奇怪的是它运行良好。怎么会这样?我 100% 确定如果不调用em.persist()em.merge()无法将更改保存到数据库中。他们可以吗?有没有可能发生这种情况的情况?

4

1 回答 1

16

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

来自Java EE 教程

当与实体关联的事务提交时,持久实体的状态将同步到数据库。

为清晰和解释而进行编辑:因此,实体在其生命周期中可能处于三种不同的模式:

  • Unsaved:实体已被实例化,但persist()尚未被调用。
  • Managed:实体已使用 持久化persist(),或从数据库加载,并与实体管理器会话相关联。当刷新实体管理器会话时,对实体的所有更改都会反映到数据库中。
  • 已分离:实体的实体管理器会话已关闭。对实体的更改不会自动反映到数据库中,但可以使用merge()命令显式合并。
于 2009-11-23T18:44:11.837 回答