Zum Inhalt springen

h:selectOneMenu (JSF 2.0), @ManyToOne Annotation in Entity (JPA 2.0)


Empfohlene Beiträge

Geschrieben

Hallo alle zusammen,

wie im Header schon erwähnt bin ich gerade dabei Java EE 6 zu lernen und lese zur Zeit ein halbes Dutzend Bücher zu dem Thema. Bevor ich diese Frage im Forum gestellt habe, habe ich bereits in den Büchern nachgeschaut und natürlich auch Google "befragt". Die Bespiele die ich dort gefunden habe sind sehr unterschiedlich und haben bei mir leider nicht so funktioniert wie ich mir das gedacht habe. Daher folgende Fragestellung.

Problem:

Ich versuche seit geraumer Zeit eine ManyToOne-Verbindung im Formular einer JSF-Seite als Drop-Down abzubilden.

Ich habe eine Entity "Product" und eine Entity "License". Es gibt eine JSF-Seite mit einem Formular mit dem man eine neue Lizenz erstellen können soll. Im SelectMenü soll ein Produkt ausgewählt werden. Wenn ich versuche das Formular zu sichern, treten immer Fehlermeldungen auf. Meine Vermutung ist, das ich einen Converter schreiben muss. Alledings habe ich keine Ahnung ob das wirklich so ist und wie man das am besten macht (state of the art).

Ich experimentiere zur Zeit mit 2 JSF-Varianten.

Variante 1:


...

<h:selectOneMenu id="product" value="#{licenseController.license.productId}">

  <f:selectItem itemLabel="Bitte auswählen..." itemValue="" />  

    <f:selectItems value="#{productController.productList}" var="n" itemLabel="#{n.name}" itemValue="#{n}"/>

</h:selectOneMenu>

Variante 2:

...

<h:selectOneMenu id="product" value="#{licenseController.license.productId}">

  <f:selectItem itemLabel="Bitte auswählen..." itemValue="" />  

    <f:selectItems value="#{productController.productList}" var="n" itemLabel="#{n.name}" itemValue="#{n.id}"/>

</h:selectOneMenu>

Der Unterschied liegt im ItemValue (einmal itemValue="#{n}, bzw. itemValue="#{n.id}). Wenn ich {n} angebe, dann scheint im Value des Feldes ein Verweis auf das Objekt zu stehen. Im zweiten Fall {n.id}, der Primärschlüssel des Datensatzes auf den verwiesen wird. Beides funktioniert nicht und erzeugt eine Fehlerausgabe. Bei beiden Varianten tritt ein Fehler beim Sichern auf. Fehlerausgabe Variante 1: Konvertierungsfehler beim Festlegen von Wert 'de.insecma.ilm.Product@1b27080' für 'null Converter'. Fehlerausgabe Variante 2: Konvertierungsfehler beim Festlegen von Wert '51' für 'null Converter'. Fragen: 1. Ist die Art der Umsetzung wie ich das momentan in der JSF-Seite mache überhaupt richtig (best coding practice)? 2. Brauche ich einen eigenen Converter? 3. Wenn ja, wie schreibe ich den am besten und wir binde ich den ein? Sonstige Code-Auszüge: License.java

@Entity

@NamedQuery(name = "findAllLicenses", query = "SELECT l FROM License l")

public class License implements Serializable {


    @Id

    @GeneratedValue(strategy=GenerationType.AUTO)

    private int id;

    @JoinColumn(name = "produktId", referencedColumnName = "name")

    @ManyToOne(optional = false)

    private Product productId;

// ... Attribute, Getter und Setter

Product.java
@Entity

@NamedQueries({

    @NamedQuery(name = "findAllProducts", query = "SELECT p FROM Product p")

})

public class Product implements Serializable {


    @Id

    @GeneratedValue(strategy = GenerationType.AUTO)

    private int id;

    @NotNull

//...

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "productId")

    private Collection<License> licenseCollection;

// ... Attribute, Getter und Setter

CustomerEJB.java
@Stateless

public class CustomerEJB {

    @PersistenceContext(unitName = "IlmPU")

    private EntityManager em;


    public List<Customer> findAll() {

        TypedQuery<Customer> query = em.createNamedQuery("findAll", Customer.class);

        return query.getResultList();

    }


    public Object findById(int id) {

        TypedQuery<Customer> query = em.createNamedQuery("findById", Customer.class);

        query.setParameter("id", id);

        return query.getSingleResult();

    }


    public Customer createCustomer(Customer customer) {

        em.persist(customer);

        return customer;

    }

}
LicenseEJB.java

@Stateless

public class LicenseEJB {

    @PersistenceContext(unitName = "IlmPU")

    private EntityManager em;


    public List<License> findLicenses() {

        TypedQuery<License> query = em.createNamedQuery("findAllLicenses", License.class);

        return query.getResultList();

    }


    public License createLicense(License license) {

        em.persist(license);

        return license;

    }

}
LicenseController:
@ManagedBean

@RequestScoped

public class LicenseController implements Serializable {


    @EJB

    private LicenseEJB licenseEJB;

    private License license = new License();

    private List<License> licenseList = new ArrayList<License>();


    public String doCreateLicense() {

        this.license = licenseEJB.createLicense(license);

        this.licenseList = licenseEJB.findLicenses();

        return "licenses.xhtml?faces-redirect=true";

    }


    public License getLicense() {

        return this.license;

    }


    public void setLicense(License license) {

        this.license = license;

    }


    public List<License> getLicenseList() {

        this.licenseList = licenseEJB.findLicenses();

        return this.licenseList;

    }


    public void setLicenseList(List<License> licenseList) {

        this.licenseList = licenseList;

    }


}
CustomerController.java
@ManagedBean

@RequestScoped

public class CustomerController implements Serializable {


    private static final Logger logger = Logger.getLogger("de.ispdata.test1.CustomerController");


    @EJB

    private CustomerEJB customerEJB;

    private Customer customer = new Customer();

    private List<Customer> customerList = new ArrayList<Customer>();


    public String doCreate() {

        this.customer = customerEJB.createCustomer(customer);

        this.customerList = customerEJB.findAll();

        return "customers.xhtml?faces-redirect=true";

    }


    public Customer getCustomer() {

        return this.customer;

    }


    public void setCustomer(Customer customer) {

        this.customer = customer;

    }


    public List<Customer> getCustomerList() {

        this.customerList = customerEJB.findAll();

        return this.customerList;

    }


    public void setCustomerList(List<Customer> customerList) {

        this.customerList = customerList;

    }    


    public Object getCustomerById(int id) {

        return customerEJB.findById(id);

    }


}   

Es wäre sehr schön wenn mit eine® von Euch helfen würde und mich auf den richtigen Weg bringt.

Vielen Dank im Voraus

Bastian

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...