使用事务注释的Hibernate在大多数(如果不是全部)查询之后需要刷新

时间:2010-12-22 14:38:27

标签: hibernate transactions hibernate-annotations

所以我们使用注释来指定一个类需要这样的事务:

@TransactionAttribute (TransactionAttributeType.REQUIRED)
public class Foo() {
...
}

在该类中实际对数据库进行更改的代码中,我们发现这些更改对于该类中的代码的其他部分是不可见的,有时是下一行。所以我们通过刷新查询来设法让事情变得有效,这感觉非常奇怪。我期待注释会使交易行为正常,但似乎我们不得不做大量的按摩才能让它发挥作用。

我花了很多时间用Google搜索,我发现的是指在xml文件中而不是在代码中使用此注释。我希望有人可以解释代码的行为,或者至少可以指向一个实际上专门处理@annotation的网站。

编辑:我们正在使用JBoss和hibernate,这里是一个不起作用的快速代码示例

System.out.println("before:" + some_obj.getName());
util = (UtilFacade) EJBFactory.lookup(UtilFacadeBean.class);
some_object.setName("changed");
util.persistEntity(some_obj);
util.refreshEntity(some_obj); // reloads the object to get fresh data
System.out.println("after:" + some_obj.getName());

此代码的输出如下:

>>before:start name
>>after:start name

但我们希望第二个显示>>之后:更改

我们设法通过添加util.flush()来解决这个问题。在调用util.persistEntity()之后。

对util的调用依赖于使用hibernate API的EntityManager。

如果我的问题不明确,请告诉我您想知道的更多内容,我会尝试编辑它。

提前感谢!

2 个答案:

答案 0 :(得分:2)

我不确定UtilFacade做了什么,但如果persistEntity()调用persist()save()refreshEntity()调用refresh(),那么您获得了正确的行为,因为refresh()使用数据库中的值覆盖持久化上下文中所做的任何更改,并且在刷新之前,持久性上下文中所做的更改不会保存到数据库中,因此数据库包含旧值调用refresh()时。

答案 1 :(得分:0)

因此,在进一步观察时,我们需要设置刷新模式。我们从我们看到的行为中相信它是默认为FlushMode.MANUAL,我们需要它是AUTO或ALWAYS。我的头在旋转,但我现在感觉好多了:P