1

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

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

在该类中实际更改数据库的代码位中,我们发现这些更改对该类中的其他代码部分不可见,有时甚至是下一行。所以我们设法通过刷新查询来让事情正常进行,这感觉真的很奇怪。我原以为注释会使事务正常运行,但似乎我们必须进行大量按摩才能使其正常工作。

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

编辑:我们正在使用 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

但我们希望第二个显示 >>after:changed

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

对 util 的调用依赖于利用休眠 API 的 EntityManager。

如果我的问题不清楚,请告诉我您还想知道什么,我会尝试编辑它。

提前致谢!

4

2 回答 2

2

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

于 2010-12-22T15:46:36.077 回答
0

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

于 2010-12-22T16:09:05.840 回答