2017-02-13 77 views
0

我有一个简单的持久化对象(Hibernate的,如果它使任何不同):PICKLIST失去价值

@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(); 
     ... 
    } 

} 

的PrimeFaces代码如下所示(相关代码段):

... 
<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被称为没有值)。