PropertyNotFound - Exception (Anfängerfrage?)

FINF_AW_Alex

Aktives Mitglied
Hallo zusammen!

Ich bin relativ neu in Java und auch in JPA und arbeite mich gerade durch ein Buch um die Beziehungen und zugehörigen Annotationen zu verstehen.

Ich habe jetzt zwei Entitys erstellt und die Entity "Kunde" mit der Entity "Adresse" per OnetoOne verknüpft. Die property "strasse" spreche ich über einen EL Ausdruck in JSF an.

Wenn ich nun Daten in die "Adresse" schreiben will findet er die verknüpfte Propperty nicht.


001.PNG


hat jemand einen Rat?

viele Grüße, Alex !!

HTML:
        <h:form id="form_gruppe">    
            
            <h:panelGrid     columns="2"  cellpadding="5" >
                <h:outputLabel   for="nname"  value="Nachname : "/>
                <h:inputText     id="nname"   value="#{beispielPM.kunde.nachname}"/>
                <h:outputLabel   for="vname"  value="Vorname : "/>
                <h:inputText     id="vname"   value="#{beispielPM.kunde.vorname}"/>
                <h:outputLabel   for="strasse"  value="Strasse : "/>
                <h:inputText     id="strasse"   value="#{beispielPM.kunde.adresse.strasse}"/>
            </h:panelGrid>
            
            <h:commandButton value="add"  action="#{beispielPM.storeKunde()}"/>
        
        </h:form>

Presentation Modell:
Java:
@Named
@RequestScoped
public class BeispielPM {
    
    private Kunde   kunde   = new Kunde();
    private Adresse adresse = new Adresse();
    
    
    @EJB
    JpaBean bean;
    
    
//------GETTER&SETTERS---------------------------

    public Adresse getAdresse() {
        return adresse;
    }

    public void setAdresse(Adresse adresse) {
        this.adresse = adresse;
    }
    
    public Kunde getKunde() {
        return kunde;
    }

    public void setKunde(Kunde kunde) {
        this.kunde = kunde;
    }
    
//------METHODS----------------------------------    
    public void storeKunde(){
        bean.addKunde(kunde);
        System.out.println("Kunde gespeichert!");
    }    
    
}
BEAN:
Java:
@Named
@Stateless
public class JpaBean {
    
    @PersistenceContext
    EntityManager em;

    
    public void addKunde(Kunde kunde){
        em.persist(kunde);
        System.out.println("Kunde hinzugefügt!");
    }
}

Kunde:
Java:
@Entity
public class Kunde implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String vorname;
    private String nachname;
    private String anrede;
    private String geburtsdatum ;
    
    @OneToOne(optional = false, cascade = CascadeType.ALL)
    @JoinColumn(name="adresse",nullable = false)
    private Adresse adresse;
 
Zuletzt bearbeitet:

Joose

Top Contributor
HTML:
                <h:inputText     id="strasse"   value="#{beispielPM.kunde.adresse.strasse}"/>

Java:
public class BeispielPM {
    private Kunde   kunde   = new Kunde();
    private Adresse adresse = new Adresse();

Du greifst auf "kunde.adresse.strasse" zu. Ich gehe davon aus das "adresse" null ist und deswegen die Exception fliegt.
Laut deinem Code erstellst du in BeispielPM ein Objekt der Klasse Kunde. Dieses Objekt enthält zwar ein Attribut vom Typ Adresse, dieses ist aber nicht initialisiert! Daher die Exception.
Du darfst den Wert nicht direkt zum Kunden schreiben sondern musst dein Adresse Objekt von Beispiel PM nehmen!
 

FINF_AW_Alex

Aktives Mitglied
Hey Joose ! :)

Danke für die schnelle Antwort, ich hatte am anfang auch den zugriff auf das Adressenobjekt vom PM

HTML:
        <h:form id="form_gruppe">    
            
            <h:panelGrid     columns="2"  cellpadding="5" >
                <h:outputLabel   for="nname"  value="Nachname : "/>
                <h:inputText     id="nname"   value="#{beispielPM.kunde.nachname}"/>
                <h:outputLabel   for="vname"  value="Vorname : "/>
                <h:inputText     id="vname"   value="#{beispielPM.kunde.vorname}"/>
                <h:outputLabel   for="strasse"  value="Strasse : "/>
                <h:inputText     id="strasse"   value="#{beispielPM.adresse.strasse}"/>
            </h:panelGrid>
            
            <h:commandButton value="add"  action="#{beispielPM.storeKunde()}"/>
        
        </h:form>

Allerdings wird so nur der Kunde geschrieben und die Adresse nicht. Es gibt auch keine Exception... komisch oder? ???:L

Ich hab es dann umgeändert weil ich dachte "die Tabelle Adresse ist doch auch ein Teil von der Kunden Tabelle" desshalb dacht ich vielleicht muss ich direkt auf das Adressenobjekt in der KundeEntity zugreifen (KUNDE Zeile 16).
 

Joose

Top Contributor
Ist natürlich logisch das dann nur der Kunde in die Datenbank kommt ohne Adresse.
Du erzeugst ein Adresse Objekt und ein Kunde Objekt, stellst aber nie eine Verbindung zwischen den beiden her.

Also: Verwende wie oben schon im Code vorhanden 2 Objekte (1xAdresse, 1xKunde) und bevor du den Kunden in die Datenbank schreibst fügst du dem Kunden die Adresse hinzu.
 

FINF_AW_Alex

Aktives Mitglied
Ja geil !!!

hat geklappt !!!

Java:
public class BeispielPM {
    
    private Kunde   kunde   = new Kunde();
    private Adresse adresse = new Adresse();
    
    
    @EJB
    JpaBean bean;
    
 //------METHODS----------------------------------    
    public void storeKunde(){
        kunde.setAdresse(adresse);     //<<--- das hab ich geändert
        bean.addKunde(kunde);
        System.out.println("Kunde gespeichert!");
    }

vielen Dank !!
 

Ähnliche Java Themen


Oben