2017-02-13 3 views
0

価値を失う:ピックリストは、私は(それがどんな違う場合は、休止状態)を、単純な永続オブジェクトを持っている

PrimeFacesのコードが(関連するスニペット)のように見えます
@Entity 
Class ObjectA 

{ 
    private Long id; 
    private String name; 
    private String description; 
    private List<ObjectA> children = new LinkedList<>(); 

    ... 
    ... 
    ... 
    public org.primefaces.model.DualListModel<ObjectA> getDualList() { 
     org.primefaces.model.DualListModel<ObjectA> l = new org.primefaces.model.DualListModel<>(); 
     l.setSource(this.children); 
     l.setTarget(database.getAllChildren()); // performs database query to retrieve all objectA that are not corrently linked to any objectA. 
     ... 
     return l; 
    } 

    public setDualList(org.primefaces.model.DualListModel<ObjectA> l) { 
     this.children = l.getSource(); 
     ... 
    } 

} 

... 
<p:dataTable id="table" value="#{managedBeanA.getAllObjects}" var="iterator" paginator="true" rows="10" > 
    ... 
    ... 
    <p:rowExpansion> 
     <p:pickList value="#{iterator.dualList}" var="l" itemLabel="#{l.name}" itemValue="#{requirement.id}"> 
      <f:facet name="sourceCaption">Linked Children</f:facet> 
      <f:facet name="targetCaption">Unlinked Children</f:facet> 
      <p:ajax event="transfer" listener="#{managedBeanA.handleTransfer(iterator)}"/> 
     </p:pickList> 
    </p:rowExpansion> 
</p:dataTable> 

何managedBeanA.handleTransfer単に渡されたオブジェクトを永続させるだけです。

すごくうまくいくようですが、行を拡張してgetDualListを呼び出すことができます。別の行を展開すると、別のgetDualListが呼び出されます。

アイテムをソースからターゲットに移動すると、managedBeanA.handleTransferが呼び出され、関連するオブジェクトがデータベースに保持されます。

ここで、テーブルが更新されると、フォームのサブミットまたはajaxのいずれかで、setDualListがp:dataTableのEMPTY getSourceですべてのアイテムに対して呼び出されることがわかります。以前に保持されたリンク(すなわちthis.children = null)。以前にリンクされたObjectAオブジェクトはまだデータベースにありますが、リンクされていません...

何が起こっているのですか?

答えて

0

私はこの問題の解決策を見つけました。私は、問題が実際に何であるかわからないように、それはおそらく唯一の回避策です - setDualList方法では、私は次の行を追加しました:

if (l.getSource().isEmpty() && l.getTarget().isEmpty()) return; 

問題の症状があることであるとして、(私のすべての問題を解決しますsetterは値なしで呼び出されます)。

関連する問題