JSF 2.1:h:dataTable不刷新数据

时间:2013-03-11 15:49:00

标签: jsf jpa datatable persistence

我已经建立了一个系统,允许您查看IT设备及其子类别的类别。 现在我希望能够通过JPA将子类别添加到父类别。

问题是我的实体是否正确保留,但它没有显示在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>

这些是我的控制器,以便持久存储并重新加载数据:

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

感谢任何帮助!

提前谢谢!

1 个答案:

答案 0 :(得分:0)

为什么不尝试使用addSub()方法刷新集合:

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

与原始问题完全无关:您正在将概念ServiceFacade相互交换。

但我建议不要将getAll()放入addSub(),而是将其设为void,然后在插入后再从客户端调用该服务。