0

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>

そして、これらはデータを永続化してリロードするための私のコントローラーです:

カテゴリコントローラ:

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

}

カテゴリサービス:

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

}

カテゴリファサード:

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

どんな助けでも大歓迎です!

前もって感謝します!

4

1 に答える 1

0

addSub()メソッドでコレクションを更新してみませんか。

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

元の質問とはまったく関係ありません。概念Serviceを相互に交換していますFacade

しかし、 を に入れる代わりに、 を作成して、挿入を行った後にクライアントからサービスへの別の呼び出しを行うことgetAll()をお勧めします。addSub()void

于 2013-03-11T16:03:10.987 に答える