从我的客户端应用程序中,我想在一个EJB方法中调用存储和刷新,而不是两个方法的两个调用。我创建了一个EJB方法,让它调用另外两个EJB方法,它看起来很简单,如下所示:
public ZippedObjectWrapper saveAndRefresh(final Item p_item) {
Long itemSavedId= save(p_item);
return refresh(itemSavedId);
}
问题是Toplink,它不允许我读取数据,并且在刷新部分引发异常:
例外[TOPLINK-7123] 异常说明:已在此UnitOfWork上调用成功的writeChanges()。由于提交过程已经启动但尚未最终确定,现在唯一支持的操作是commit,commitAndResume,release,任何非对象级别查询或SQLCall执行。此时不允许执行executeQuery(ObjectLevelReadQuery)操作。
有什么建议吗?
编辑:更改了方法签名。
答案 0 :(得分:1)
不确定你的save()方法是做什么的,但我假设你在UnitOfWork上调用writeChanges()。 在您使用的版本中的writeChanges()之后,不允许查询。删除writeChanges()应该可以解决问题。
如果升级到EclipseLink和JPA,则可以在事务中多次使用flush()并在之后进行查询。您也可以使用RepeatableWriteUnitOfWork而不是UnitOfWork来启用对writeChanges()的多次调用并允许查询。
答案 1 :(得分:0)
问题在于Toplink,特别是它在我们使用的版本中处理数据库操作的方式。当您扩展Toplink类或更好的一个升级Toplink时,有一个部分解决方案:)