JSF | Hibernate | MySQL

k4lle

Grünschnabel
Ich habe folgendes Problem. Ich sage erstmal wie ich mir das prinzipiell vorstelle und hoffe ihr könnt mir sagen ob ich da schon eun denkfehler habe.

Ich will zum Test ein paar Eingaben aus einem JSF-Formular mittel Hibernate in einer SQL-DB speichern.
So stelle ich mir das vor:
- durch Value-Binding Werte aller Komponente an die Bean Properties binden.
- Managed Beans in faces-config.xml schreiben
- Hibernate libs einbinden
- erstelle hibernate.cfg.xml, mapping-datei, und tabelle in DB
- jetzt schreibe ich z.B ein Klasse, wo z.B eine Operation zum schreiben in DB
steht.

Wenn man jetzt alles richtig gemacht hat, müßte es klappen. richtig?

jetzt noch eine verständnisfrage. wenn ich z.b. in einem formular einen commandButton habe und mittels value="#{UserManager.speichern}" eine Operation anhänge, dann wird ja diese Operation aufgerufen.
Ich kann aber irgendwie nicht ganz nachvollziehen, wie ich die Wert welche sich durchs value-binding in den beans befinden, in der DB speichere, bzw. wie ich in meinem fall der methode speichern die Werte aus den beans übergebe, damit diese alle eingacben in der DB speichert.
ich hoffe ich habe mich fürs erste verständlich ausgedrückt....
 
ich konkretisiere das mal...

Hallo. Ich will zum test ein 2 Werte die in einem JSF-Formular eingegeben werden abspeichern. es klappt aber irgendwie nicht. ich verstehe das wohl was nicht richtig....

ich will jetzt nicht allen code posten, sondern nur da wo ich mir unsicher bin.

<h:inputText size="14" value="#{UserHandler.user.name}"></h:inputText>
<h:inputText size="14" value="#{UserHandler.user.alter}"></h:inputText>
übergebe werte an bean-properties...

so jetzt kommen meine probleme...
<h:commandButton value="speichern"
action="#{UserHandler.saveUser}"></h:commandButton>
hier soll die die methode saveUser aufgerufen werden und da soll der User abgespeichert werden....

public void saveUser(String name, int alter){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
User meinUser = new User();
meinUser.setName(name);
meinUser.setAlter(alter);
session.beginTransaction();
session.save(meinUser);
session.getTransaction().commit();
HibernateUtil.getSessionFactory().close();
}
ich verstehe einfach nicht, wie ich die werte aus den bean-properties dieser
methode übergebe, damit sie gespeichert werden......
kann mir da jemand helfen?
 
Bekomme immer diese Fehlermeldung:

javax.faces.el.PropertyNotFoundException: Base is null: .benutzer org.apache.myfaces.el.ValueBindingImpl.resolveToBaseAndProperty(ValueBindingImpl.java:477)
org.apache.myfaces.el.ValueBindingImpl.getType(ValueBindingImpl.java:175) org.apache.myfaces.shared_impl.renderkit._SharedRendererUtils.findUIOutputConverter(_SharedRendererUtils.java:58)
org.apache.myfaces.shared_impl.renderkit.RendererUtils.findUIOutputConverter(RendererUtils.java:310)org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedUIOutputValue(RendererUtils.java:604)
org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.getConvertedValue(HtmlTextRendererBase.java:191)
javax.faces.component.UIInput.getConvertedValue(UIInput.java:396)
javax.faces.component.UIInput.validate(UIInput.java:350)
javax.faces.component.UIInput.processValidators(UIInput.java:184) javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
javax.faces.component.UIForm.processValidators(UIForm.java:73) javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:627)
javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:149) org.apache.myfaces.lifecycle.ProcessValidationsExecutor.execute(ProcessValidationsExecutor.java:32)
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)

in der Klasse Benutzer sind die Attribute und getter + setter
BenutzerHandler sieht so aus:
public class BenutzeHandler {
public Benutzer benutzer;

public void saveBenutzer(){
Benutzer meinBenutzer = new Benutzer();
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(meinBenutzer);
session.getTransaction().commit();
HibernateUtil.getSessionFactory().close();
}
public void setBenutzer(Benutzer benutzer){
this.benutzer = benutzer;
}
public Benutzer getBenutzer(){
return benutzer;
}
}
Das Formular so:
<h:form>
<h:panelGrid columns="2">
<h:eek:utputLabel value="Name"></h:eek:utputLabel>
<h:inputText size="14" value="#{BenutzerHandler.user.name}"></h:inputText>
<h:eek:utputLabel value="Alter"></h:eek:utputLabel>
<h:inputText size="14" value="#{BenutzerHandler.user.alter}"></h:inputText>

<h:commandButton value="speichern"
action="#{BenutzerHandler.saveBenutzer}"></h:commandButton>
<h:eek:utputLabel></h:eek:utputLabel>
</h:panelGrid>
</h:form>

Was mache ich falsch?
 
mein letzter versuch, in der hoffnung, dass mal jemand was dazu sagt ;-)

so siehts mittlerweile aus....
faces-config.xml
<managed-bean>
<managed-bean-name>UserHandler</managed-bean-name>
<managed-bean-class>beans.UserHandler</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

Formular
<f:view>
<h:form>
<h:panelGrid columns="2">
<h:eek:utputLabel value="Name"></h:eek:utputLabel>
<h:inputText size="14" value="#{User.name}"></h:inputText>
<h:eek:utputLabel value="Alter"></h:eek:utputLabel>
<h:inputText size="14" value="#{User.alter}"></h:inputText>
<h:commandButton value="speichern"
action="#{UserHandler.saveUser}"></h:commandButton>
<h:eek:utputLabel></h:eek:utputLabel>
</h:panelGrid>
</h:form>
</f:view>

UserHandler
public class UserHandler {
public User user;

public UserHandler(){
this.user = new User();
}
public void saveUser(){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
HibernateUtil.getSessionFactory().close();
}
}

Bekomme immer die Exception: javax.faces.el.PropertyNotFoundException: Base is null: .user

Wenn ich das jetzt alles richtig verstanden habe, dann müßte das doch jetzt so ablaufen:
UserHandler ist in faces-config deklariert. Jetzt wird im Konstruktor ein User-Objekt durch Faces erzeugt. So soll es ja auch sein. Die Attribute name und alter sind an die Bean-Propertys gebunden. Wenn jetzt die Funktion saveUser() aufgerufen wird, sollte das Objekt mit den eingegeben Werten, welche sich in den setter/getter methoden befinden, gespeichert werden.

Soviel zur Theorie :)

Mein letzte Versuch eine Antwort zu bekommen :)
 
Hi,

bei Deinem letzten Post fällt mir auf, dass Du in Deiner JSP auf ein ManagedBean User zugreifst, welches in der faces-config.xml nicht definiert ist. Was Du haben willst ist wohl etwas in der Art:

JSP
XML:
<f:view>
<h:form>
<hanelGrid columns="2">
<h:outputLabel value="Name"></h:outputLabel>
<h:inputText size="14" value="#{UserHandler.user.name}"></h:inputText>
<h:outputLabel value="Alter"></h:outputLabel>
<h:inputText size="14" value="#{UserHandler.user.alter}"></h:inputText>
<h:commandButton value="speichern"
action="#{UserHandler.saveUser}"></h:commandButton>
<h:outputLabel></h:outputLabel>
</hanelGrid>
</h:form>
</f:view>

Und so einem Handler:
Code:
public class UserHandler {
  public User user;

  public UserHandler(){
    this.user = new User();
  }

  public void saveUser(){
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    session.save(user);
    session.getTransaction().commit();
    HibernateUtil.getSessionFactory().close();
  }

  public User getUser() { return user; }
}

Gruß, Basti
 
Zuletzt bearbeitet von einem Moderator:
ich will es so machen wie du gesagt hast.... UserHandler in ManagedBean deklarieren. Dann erzeuge ich in der ManagedBean ein Obvjekt im Konstruktor und will dieses abspeichern.... so ist mein plan...
 
So jetzt will ich das Objekt in der DB spiehcern. Dabei treten leider folgende Fehler auf.

java.lang.ExceptionInInitializerError
beans.UserHandler.processAction(UserHandler.java:32)
javax.faces.event.ActionEvent.processListener(ActionEvent.java:51)
javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:487)
javax.faces.component.UICommand.broadcast(UICommand.java:78)
javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:97)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:171)
org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)

org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: Class org.apache.commons.logging.impl.Log4JLogger does not implement Log
org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:532)
org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:272)
org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:246)
org.apache.commons.logging.LogFactory.getLog(LogFactory.java:395)
org.hibernate.cfg.Configuration.<clinit>(Configuration.java:120)
beans.UserHandler.processAction(UserHandler.java:32)
javax.faces.event.ActionEvent.processListener(ActionEvent.java:51)
javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:487)
javax.faces.component.UICommand.broadcast(UICommand.java:78)
javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:97)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:171)
org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)

Meine action-methode wo der das speichern geschehe soll sieht so aus:
public void processAction(ActionEvent ae) throws AbortProcessingException {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction trans = session.beginTransaction();
session.save(user);
trans.commit();
session.close();
}

was habe ich da falsch gemacht?
 
Hallo,

java.lang.ExceptionInInitializerError [...]

Diese Exception tritt auf, wenn du einen Fehler in deiner HibernateConfig.xml Datei hast. Überprüfe diese mal.

Um das zu Debuggen könntest du mal deinen code in einen Try-Catch-Block packen und eine HibernateException ganz allgemein abfangen.

Viele Grüße,
BigManu
 

Neue Beiträge

Zurück