为什么回滚不会回复原始值?

时间:2015-04-20 03:21:09

标签: hibernate

我有以下简化 Hibernate测试代码,以了解回滚的工作原理。

Session session = MySessionFactory.getSession();
Transaction tx = session.beginTransaction();
try
{
    //1. get a persistent User
    User user = (User) session.get(User.class, user3Id);
    System.out.println("1. original: user.username=" + user.getUsername());

    //2. update it
    String newUserName = userName3 + "Updated";
    user.setUsername(newUserName);
    session.saveOrUpdate(user);
    session.flush();
    System.out.println("2. updated: user.username=" + user.getUsername());

    //3. rollback
    tx.rollback();
    System.out.println("3. rollback: user.username=" + user.getUsername());

    //4. session close
    session.close();
    System.out.println("4. session close: user.username=" + user.getUsername());
}
catch (Exception e)
{
    tx.rollback();

    throw e;
}
finally
{
    session.close();
}

它的作用是:

  1. 从数据库中获取持久对象;

  2. 更新其名称字段;

  3. 回滚交易;

  4. 对于每个步骤,我打印出用户名字段的值。如果用户名来自第1步,我希望用户名在回滚后。但打印输出不是:2,3,4的所有打印输出都是相同的,更新的名称字符串。

    所以回滚只是回滚数据库而不是持久对象

    额外工作我必须做的是让持久对象回滚到其原始状态,即步骤1状态?

1 个答案:

答案 0 :(得分:1)

刷新会话会强制Hibernate将Session的内存中状态与数据库同步。您可以说另一种方法来提交更改而不运行commit()方法。

  

我需要做些额外的工作才能使持久对象回滚到其原始状态,即步骤1状态?

在回滚之前删除session.flush()。