我有以下简化 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状态?
答案 0 :(得分:1)
刷新会话会强制Hibernate将Session的内存中状态与数据库同步。您可以说另一种方法来提交更改而不运行commit()方法。
我需要做些额外的工作才能使持久对象回滚到其原始状态,即步骤1状态?
在回滚之前删除session.flush()。