2011-03-11 54 views
3

从我的客户端应用程序中,我想用一个EJB方法调用存储和刷新,而不是对两个方法进行两次调用。我做了一个EJB方法,使其调用其他两个EJB方法,它看起来很简单,就像这样:使用EJB 2.0和JPA(Toplink)问题存储和刷新对象

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

请使用英文变量名称。对于大多数SO用户来说这是不可能的。 – atamanroman 2011-03-11 09:05:44

+0

你如何管理交易? – axtavt 2011-03-11 09:44:44

+0

你究竟是什么意思? – Andrija 2011-03-11 09:51:28

回答

0

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

1

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

如果您升级到EclipseLink和JPA,则可以在事务中查询多次并使用flush()。您也可以使用RepeatableWriteUnitOfWork代替UnitOfWork来启用多次调用writeChanges()并允许查询。