JPA - 保存更改不会持续()调用

问题描述:

我们正在使用JPA + Spring + EJB的Toplink实现。在我们的一个EJB中,我们有这样的东西:JPA - 保存更改不会持续()调用

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(),但没有办法将更改保存到数据库中。他们可以吗?有没有这种情况发生的情况?

感谢

你是一个管理实体的工作。如果实体由于其实体管理器关闭而未被分离,则在刷新/关闭会话并提交事务时,对实体所做的所有更改都会反映到数据库中。

Java EE tutorial

持久实体的状态被 同步到数据库时 交易与该实体是 相关联的提交。

清楚和解释编辑:那么有三种不同的模式,一个实体可以其生命周期内是:

  • 未保存:实体已被实例化,但persist()还没有被称为尚未。
  • 管理:实体已使用persist()持久保存,或从数据库加载,并与实体管理器会话相关联。实体管理器会话刷新时,实体的所有更改都会反映到数据库中。
  • 分离:实体的实体经理会话已关闭。对实体的更改不会自动反映到数据库,但可以使用merge()命令明确合并。
+0

谢谢。这非常有帮助!我一直认为调用em.persist()是必需的,即使对象与当前的EntityManager关联。 – anthony 2009-11-24 18:21:42

+0

奇怪:在我的设置中,我有一个托管实体的参考。然后我改变这个实体的状态。然后我调用'entityManager.flush()'。如果这是在事务内运行,那么实体的更改状态**将写入**到数据库。在没有事务的情况下运行,那么实体的更改状态**不会写入**到数据库。所以下面的语句是真的吗?:*“为了将最新状态的'obj'写入数据库,总是必须有一个事务提交或一个'entityManager.persist(obj)'调用。”* ....(我在Hibernate(4.1.7.Final)中使用JPA 2.0) – Abdull 2013-02-13 16:53:22

+0

@Abudull,是的,JPA规范没有定义任何自动提交行为,所以你需要一个正在进行的事务或根本没有任何东西被写入数据库。 – Henning 2013-02-13 18:37:14