3

从我的客户端应用程序中,我想在一个 EJB 方法中调用存储和刷新,而不是对两个方法的两次调用。我做了一个 EJB 方法,让它调用其他两个 EJB 方法,看起来很简单,像这样:

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

问题是 Toplink 不允许我读取数据并且在刷新部分抛出异常:

异常 [TOPLINK-7123] 异常描述:已在此 UnitOfWork 上调用了成功的 writeChanges()。由于提交过程已经开始但尚未最终确定,现在唯一支持的操作是提交、commitAndResume、发布、任何非对象级查询或 SQLCall 执行。此时不允许执行 executeQuery(ObjectLevelReadQuery) 操作。

有什么建议么?

编辑:更改方法签名。

4

2 回答 2

1

不确定您的 save() 方法是做什么的,但我假设您正在 UnitOfWork 上调用 writeChanges()。在您使用的版本中 writeChanges() 之后不允许查询。删除 writeChanges() 应该可以解决问题。

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

于 2011-04-07T13:36:51.050 回答
0

问题出在 Toplink,特别是它在我们使用的版本中处理数据库操作的方式。扩展 Toplink 类时有部分解决方案,或者更好的是升级 Toplink :)

于 2011-04-07T12:45:16.820 回答