如何回滚 JDeveloper ADF 中的特定行?

Posted

技术标签:

【中文标题】如何回滚 JDeveloper ADF 中的特定行?【英文标题】:How to rollback a specific row in JDeveloper ADF? 【发布时间】:2021-08-07 20:51:31 【问题描述】:

有没有办法回滚特定的更改。我有一个按钮,可以在两个不同的表中创建一行。我希望在提交之前回滚其中一个表中的更改,以便只提交第二个表。这将如何完成?运行正常回滚会回滚两个表迭代器。

我一直在尝试不同的方法,但没有任何效果,请在我发疯之前帮助。

【问题讨论】:

如果您只是要从头开始回滚,为什么要进行第一次更改?如果回滚是有条件的,那么在插入第二个之前检查您的条件并回滚。鉴于您的要求,这两者在逻辑上显然不是一个单一的交易。 第一个是历史表,向用户显示添加的所有内容。单击应用按钮后,新信息将同时添加到历史记录表和批准表中。此时该行仅被添加到历史表中以显示已进行更改/新行。如果更改在批准行中获得批准,则其将保存在下一行的历史记录表中并提交。在这个阶段,它只是一个变化指标。所以我想添加它并在按下提交时将其删除,以便新行可以提交到批准表但从第一个表中删除。 据我所知,您只能在 ADF (cedricleruth.com/…) 中回滚事务,如果您想在特定用例上恢复到以前的值,则必须编写自定义 java 代码在您的 VO RowImpl 中 【参考方案1】:

找出你想要回滚的对应的'VO'行。

#1。 row.setNewRowState(Row.STATUS_INITIALIZED) ;

#2。行.revertRow() ;

#3。 row.remove() ;

【讨论】:

【参考方案2】:

最接近回滚一行的方法可能是使用适当的参数在视图行上调用刷新,如下所示:

//Obtain app module
DCBindingContainer dcb = (DCBindingContainer) BindingContext.getCurrent().getBindingsEntry();
ApplicationModuleImpl am = (ApplicationModuleImpl) dcb.getDataControl().getDataProvider();

//Get your view
ViewObjectImpl vo = am.getMyView1;
ViewRowImpl row = vo.getCurrentRow(); //alternately use vo.findByKey to lookup a row or simply iterate through every row if dataset is sufficiently small
//rollback the row
row.refresh(Row.REFRESH_REMOVE_NEW_ROWS | Row.REFRESH_UNDO_CHANGES | Row.REFRESH_CONTAINEES);//review modes for ideal combination for use case

请注意,row.remove() 可能足以满足您正在尝试执行的操作,而不是刷新。在任何情况下,您都需要跟踪您不想提交的行。

虽然此解决方案可行,但听起来并不适合您的用例。如果您从不提交另一个表中的数据,则没有理由将其链接到数据库表。我可能会改为执行以下操作之一:

    如果两个表中的字段相同(或相似)并且这将是一次性操作,则在 ADF 视图对象上创建一个临时属性以表示该行是否被批准。在视图对象的不同实例上使用视图标准(两次添加到您的应用程序模块)来显示/处理您想要的行。在提交之前删除未批准的行。

    如果需要的字段差异太大,或者您希望能够一次处理一行,请将历史视图对象设置为具有瞬态属性的编程视图对象,而不是基于表/实体。当一行获得批准时,将其从您的历史记录视图中删除,并将其添加到您批准的视图中。

【讨论】:

以上是关于如何回滚 JDeveloper ADF 中的特定行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ADF 中设置滚动条位置

怎样開始学习ADF和Jdeveroper 11g

怎样開始学习ADF和Jdeveroper 11g

将 JDeveloper 应用程序连接到 Oracle Live SQL

在Glassfish 5.0中部署ADF WEbapp时出错

使用 ADF 和 Oracle SQL 执行缓慢的视图