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

ant*_*ony 10 jpa persist toplink-essentials

我们正在使用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
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Hen*_*ing 12

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

Java EE教程:

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

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

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