所以我们使用注释来指定一个类需要这样的事务:
@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。
如果我的问题不明确,请告诉我您想知道的更多内容,我会尝试编辑它。
提前感谢!
答案 0 :(得分:2)
我不确定UtilFacade
做了什么,但如果persistEntity()
调用persist()
或save()
和refreshEntity()
调用refresh()
,那么您获得了正确的行为,因为refresh()
使用数据库中的值覆盖持久化上下文中所做的任何更改,并且在刷新之前,持久性上下文中所做的更改不会保存到数据库中,因此数据库包含旧值调用refresh()
时。
答案 1 :(得分:0)
因此,在进一步观察时,我们需要设置刷新模式。我们从我们看到的行为中相信它是默认为FlushMode.MANUAL,我们需要它是AUTO或ALWAYS。我的头在旋转,但我现在感觉好多了:P