Tatsu1 Geschrieben 10. März 2011 Geschrieben 10. März 2011 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 Zitieren
Tatsu1 Geschrieben 13. März 2011 Autor Geschrieben 13. März 2011 Hallo, die Lösung zu dem Problem findet Ihr in diesem Beitrag. Zitieren
Empfohlene Beiträge
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.