我们正在使用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()的情况下,无法将更改保存到数据库中。他们可以吗?有可能发生这种情况吗?
由于
答案 0 :(得分:12)
您正在使用托管实体。如果实体由于其实体管理器已关闭而未分离,则在刷新/关闭会话并提交事务时,对实体所做的所有更改都会反映到数据库中。
持久性实体的状态是 同步到数据库的时候 实体所在的交易 相关提交。
编辑以获得清晰度和解释:因此,实体在其生命周期中可能存在三种不同的模式:
persist()
。persist()
保留,或从数据库加载,并与实体管理器会话关联。在刷新实体管理器会话时,对实体的所有更改都会反映到数据库中。merge()
命令显式合并。