2013-03-11 25 views
0

我建立了一個系統,允許您查看IT設備及其子類別的類別。 現在我希望能夠通過JPA將子類別添加到父類別。JSF 2.1:h:dataTable不刷新數據

問題是我的實體持續正確,但它不顯示在dataTable中。我需要開始一個新的會話以使其可見。

這是我的XHTML頁面:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 
    <h:head> 
     <title>Kategorie Tester</title> 
     <h:outputStylesheet library="css" name="tables.css"/> 
     <f:metadata> 
      <f:event type="preRenderView" listener="#{kategorieController.beforeRenderLoadKat}"/> 
     </f:metadata> 
    </h:head> 
    <h:body> 
     <h:form> 
      <h:dataTable value="#{kategorieController.reload()}" 
         var="kat" 
         styleClass="katview"> 
       <h:column> 
        <f:facet name="header"> 
         Kategorie 
        </f:facet> 
        <h:outputText value="#{kat.titel}"/> 
       </h:column> 
       <h:column> 
        <f:facet name="header"> 
         Unterkategorie 
        </f:facet> 
        <h:selectManyCheckbox layout="pageDirection"> 
         <f:selectItems value="#{kat.unterkategorieList}" 
             var="sub" 
             itemLabel="#{sub.titel}" 
             itemValue="#{sub.idunterkategorie}"/> 
        </h:selectManyCheckbox> 
       </h:column> 
      </h:dataTable> 
      <h:panelGroup> 
       <h:inputText value="#{kategorieController.titel}"/> 
       <h:selectOneMenu value="#{kategorieController.kategorie.idkategorie}"> 
        <f:selectItems id="kategorie" value="#{kategorieController.allKats}" 
            var="kati" 
            itemLabel="#{kati.titel}" 
            itemValue="#{kati.idkategorie}"/> 
       </h:selectOneMenu> 
       <h:commandButton value="Add" action="#{kategorieController.addSub()}"/> 
      </h:panelGroup> 
     </h:form> 
    </h:body> 
</html> 

而這些都是我的控制器,以堅持和relaod數據:

KategorieController:

package controller; 

import java.io.Serializable; 
import java.util.List; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.event.ComponentSystemEvent; 
import javax.inject.Inject; 
import model.Kategorie; 
import model.Unterkategorie; 

@ManagedBean 
@SessionScoped 
public class KategorieController implements Serializable { 

    @Inject 
    private KategorieService katService; 
    private List<Kategorie> allKats; 
    // Hinzufügen 
    private Unterkategorie subkategorie; 
    private Kategorie kategorie; 
    private String titel; 

    public void beforeRenderLoadKat(final ComponentSystemEvent event) { 
     if (allKats != null) { 
      allKats.clear(); 
     } 
     allKats = katService.getAll(); 
     subkategorie = new Unterkategorie(); 
     kategorie = new Kategorie(); 
    } 

    public void addSub() { 
     subkategorie.setKategorieId(kategorie); 
     subkategorie.setTitel(titel); 
     katService.addSub(this.subkategorie); 
    } 
// GETTERS AND SETTERS 

} 

KategorieService:

package controller; 

import java.io.Serializable; 
import java.util.List; 
import javax.ejb.Stateless; 
import javax.ejb.TransactionAttribute; 
import javax.ejb.TransactionAttributeType; 
import javax.inject.Inject; 
import model.Kategorie; 
import model.Unterkategorie; 

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class KategorieService implements Serializable { 

    @Inject 
    private KategorieFacade katFacade; 

    public List<Kategorie> getAll() { 
     return katFacade.getAll(); 
    } 

    public List<Kategorie> addSub(final Unterkategorie sub) { 
     return katFacade.addSub(sub); 
    } 

} 

KategorieFacade:

package controller; 

import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.TypedQuery; 
import model.Kategorie; 
import model.Unterkategorie; 

public class KategorieFacade { 

    @PersistenceContext 
    private EntityManager em; 

    public List<Kategorie> getAll() { 
     TypedQuery<Kategorie> query = em.createNamedQuery("Kategorie.findAll", Kategorie.class); 
     return query.getResultList(); 
    } 

    public List<Kategorie> addSub(final Unterkategorie sub) { 
     em.persist(sub); 
     em.flush(); 
     return getAll(); 
    } 
} 

任何幫助表示讚賞!

預先感謝您!

+0

你能告訴我'#{kategorieController.reload()}'背後的方法嗎? – 2013-03-11 15:52:59

+0

reload()只返回列表「allKats」。我忘了刪除它。我用value =「#{kategorieController.allKats」替換它,但它仍然不起作用。 – 2013-03-11 15:59:12

回答

0

你爲什麼不嘗試刷新集合中的addSub()方法:

public void addSub() { 
    subkategorie.setKategorieId(kategorie); 
    subkategorie.setTitel(titel); 
    allKats.clear(); 
    allKats.addAll(katService.addSub(this.subkategorie)); 
} 

而且完全無關的原題:你交換的概念ServiceFacade彼此。

但我建議不要把getAll()放入addSub(),而應該將其設置爲void,並在插入後再執行一次從客戶端到服務的調用。