Hibernate Transaction也不会持久化对象更改

时间:2011-07-22 10:03:41

标签: hibernate transactions persistence

我正在开发一个Spring / Hibernate应用程序,我在尝试对现有对象进行更新时会看到一些意外行为。

目前,我有一个服务类方法,只需按如下方式更新对象:

@Transactional
public void updateToDoCompletion(long id, boolean completed){
    ToDo todo = getEntityManager().find(ToDo.class, id);
    if (todo!=null){
        todo.setCompleted(completed);
    }
}

我的理解是围绕该方法启动事务,加载ToDo对象(在事务中),然后在事务结束后对该对象所做的任何更改都将保留(在本例中为方法)正在我的控制器类中从事务外部调用,所以我希望事务只是为了这个方法而持续。)

但是,在完成上述操作后,对对象的更改永远不会持久保存到数据库中。

有趣的是,交易结束时的这个更新在其他地方以相同的设置工作(就预期的事务边界等而言),所以我正在试验代码并更新方法如下:

@Transactional
public void updateToDoCompletion(long id, boolean completed){
    ToDo todo = getEntityManager().find(ToDo.class, id);
    if (todo!=null){
        todo.setCompleted(completed);
    }

    Team t = conService.loadTeam(50l);
    t.setDescription("test description!");
}

这一次,在对原始对象进行更改之后,我已经加载了一个不同的对象,并对其进行了更改 - 我这样做是因为我可以看到其他方法的唯一区别是它们按预期工作了到其他类中的Transactional方法(因此添加的代码,conService.loadTeam(50l)是另一个服务类中的事务方法)。现在,ToDo对象的原始更改将按照我的希望保留,但Team对象的更改不会。

所以我的问题是:

  1. 我是否曾经误解了一些hibernate事务的概念?
  2. 为什么在将调用添加到其他事务conService类时,我的原始对象现在开始变为持久化
  3. 为什么Team对象的更改不会被持久化? (obv我不想在这里制作这段代码,但有兴趣了解究竟发生了什么)
  4. 由于

1 个答案:

答案 0 :(得分:0)

好吧,似乎添加对其他服务类的调用是一个红色的鲱鱼 - 似乎很多持久性有点不稳定,如果我清理项目并重新启动服务器,那么原始代码工作正常。

有没有人发现这个?我正在使用Elcipse Gallileo和Tomcat。