使用EJB 2.0和JPA(Toplink)存储和刷新对象的问题

3

我希望能够通过一个EJB方法来调用两个方法进行存储和刷新。我创建了一个EJB方法,使其调用其他两个EJB方法,看起来很简单,就像这样:

 public ZippedObjectWrapper saveAndRefresh(final Item p_item) {
    Long itemSavedId= save(p_item);
    return refresh(itemSavedId);
  }

问题出在Toplink上,它不允许我读取数据,在刷新部分会抛出异常:
异常[TOPLINK-7123] 异常描述:在此UnitOfWork上已经成功调用writeChanges()。由于提交过程已经开始但尚未完成,因此现在仅支持的操作是提交、提交并恢复、释放、任何非对象级别查询或SQLCall执行。目前不允许执行executeQuery(ObjectLevelReadQuery)操作。
有什么建议吗?
编辑:更改方法签名。

请使用英文变量名。对于大多数SO用户来说,这是不可能阅读的。 - atamanroman
你如何管理事务? - axtavt
你具体是什么意思? - Andrija
你能添加保存和刷新方法的代码吗? - Matt Handy
EJB方法并没有做任何有用的事情,它们只是调用服务层。服务层方法从数据库中读取/写入一些数据。我可以复制/粘贴它,但它并不是那么容易理解的。有什么特别的地方我可以在代码中检查/粘贴其中的一部分吗? - Andrija
2个回答

1

我不确定你的save()方法具体做了什么,但我猜测你在UnitOfWork上调用了writeChanges()。

在你使用的版本中,在writeChanges()之后是不允许查询的。如果移除writeChanges(),问题应该就能解决。

如果你升级到EclipseLink和JPA,你可以在事务中多次使用flush()并进行查询。你也可以手动使用RepeatableWriteUnitOfWork而不是UnitOfWork来启用多次调用writeChanges()并允许查询。


0
问题出在Toplink,具体来说是它在我们使用的版本中处理数据库操作的方式。当你扩展一个Toplink类或者升级Toplink时,有一种部分解决方案 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接