如何杀死POJO数据控件实例?

时间:2015-12-02 07:23:09

标签: java oracle-adf oracle-maf

我有一个pojo数据控件" WagonDC"如下所示:

package mobile.local;

import java.util.ArrayList;
import java.util.List;

import mobile.WagonEntity;

import oracle.adfmf.java.beans.PropertyChangeSupport;
import oracle.adfmf.java.beans.ProviderChangeListener;
import oracle.adfmf.java.beans.ProviderChangeSupport;

public class WagonDC {

    private WagonEntity wagonEntity;
    private List wagonListDetails = new ArrayList();
    private WagonlistAdapter adapter = new WagonlistAdapter();

    public WagonDC() {
        super();
        System.out.println("----WAGON DC CALLED-----");
        findAll();
    }

    protected transient ProviderChangeSupport providerChangeSupport = new ProviderChangeSupport(this);

    public void addProviderChangeListener(ProviderChangeListener l) {
      providerChangeSupport.addProviderChangeListener(l);
    }

    public void removeProviderChangeListener(ProviderChangeListener l) {
       providerChangeSupport.removeProviderChangeListener(l);
    }


    public void setWagonEntity(WagonEntity wagonEntity) {
      this.wagonEntity = wagonEntity;
    }

    public WagonEntity getWagonEntity() {
      return wagonEntity;
    }

    public WagonEntity[] getWagonListDetails() {
        System.out.println("-------getWagonListDetails called-------");
      return (WagonEntity[]) wagonListDetails.toArray(new WagonEntity[wagonListDetails.size()]);
    }

    public void findAll() {
      wagonListDetails = adapter.findAllwagonList();
      if(wagonListDetails.size()>0){
          providerChangeSupport.fireProviderRefresh("wagonListDetails");
      }
    }

    public void refresh(){
        System.out.println("--Refreshing--");
        findAll();
        System.out.println("--Refreshed--");
    }

    public void update(WagonEntity wagonEntity) {
       boolean success = adapter.updateWagon(wagonEntity);
       if (success) {
         int index = wagonListDetails.indexOf(wagonEntity);
         wagonListDetails.set(index, wagonEntity);
       }
     }
}

当Wagons列出页面加载时,第一次调用此Data控件,如下所示:

<amx:listView var="row" value="#{bindings.wagonListDetails1.collectionModel}"
                                  fetchSize="#{bindings.wagonListDetails1.rangeSize}"
                                  selectedRowKeys="#{bindings.wagonListDetails1.collectionModel.selectedRow}"
                                  initialScrollRowKeys="#{bindings.wagonListDetails1.collectionModel.selectedRow}"
                                  selectionListener="#{bindings.wagonListDetails1.collectionModel.makeCurrent}"
                                  showMoreStrategy="autoScroll" bufferStrategy="viewport" id="lv2" >
        <amx:listItem id="li2">             
           <amx:outputText value="Wagon No: #{row.WAGON_NO}" id="ot19"/>
           <amx:outputText value="Product: #{row.PRD_DESC}" id="ot20"/>
        </amx:listItem>
</amx:listView>

问题是当页面第二次加载时,这次是POJO数据控制方法&#34; getWagonListDetails()&#34;不叫。看起来POJO DC在第一次在绑定上下文中调用时创建POJO的实例,第二次它显示来自先前创建的实例或设备缓存的数据。但如果我有一些更新的数据,那么它不会在页面上显示。所以我有两个问题:

  1. 有没有办法杀死以前的实例来加载另一个新实例?
  2. POJO是否将数据存储在缓存中,因为如果我关闭我的应用程序并重新打开,那么我可以看到更新的值?
  3. 如果数据存储在缓存中,那么是否有任何配置设置可以阻止Oracle MAF中的数据缓存?
  4. 注意:我可以通过调用&#34; refresh()&#34;手动刷新页面数据。 POJO中定义的方法。

1 个答案:

答案 0 :(得分:2)

实际上,数据控件的范围取决于它的创建位置。 ApplicationController项目中的配置使其具有应用程序范围。 ViewController项目中的Th配置将使其具有Feature的范围。

回答你的问题:

“有没有办法杀死以前的实例来加载另一个新实例?”

不,没有必要。实际上,您的示例在构造函数中查询数据。您也可以从外部调用查询方法。如果数据发生更改,则在更新列表(集合)的方法中调用提供者更改事件,MAF框架将识别自己必须刷新UI以显示数据更改。

“POJO是否将数据存储在缓存中,因为如果我关闭我的应用程序并重新打开,那么我可以看到更新的值?”

如上所述,实例的范围取决于它的配置位置。实例保留信息,直到您更改它或告诉实例不再记住它(通过将列表设置为空列表)

“如果数据存储在缓存中,那么是否存在任何配置设置以阻止Oracle MAF中的数据缓存?”

如上所述,它是您创建的POJO类的一个实例。所有州都保存在属性中(在您的情况下为列表)。因此,您可以公开一种方法来对其进行核对或刷新,然后 - 如果您想在运输途中做一些事情 - 您可以使用例如方法调用活动,以执行您希望它执行的操作。