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

时间:2011-03-11 09:03:07

标签: java jpa ejb toplink

从我的客户端应用程序中,我想在一个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)操作。

有什么建议吗?

编辑:更改了方法签名。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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