# JSF | Hibernate | MySQL



## Guest (26. Sep 2007)

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....


----------



## maki (26. Sep 2007)

Für mich hört sich da so an, als ob du ein Tutorial für JSF suchst, dann brauchst du noch eines für Hibernate/JPA, vielleicht sogar eines für EJBs... vielleicht findest du ja eines für alle 3.


----------



## Guest (26. Sep 2007)

also ich denke für JSF nicht..... für hibernate habe ich mir bereits einige tutorials angeguckt. trotzdem sind da noch einige fragen offen geblieben, aber das ist ja immer so.

wenn jemand natürlich ein tutorial kennt wo es wirklich zusammen um JSF und Hibernate geht, dann wäre das natürlich super.

vielleicht ist mir aber auch schon weitergeholfen, wenn jemand etwas zu meinen oben augestellten thesen  sagen könnte. ich würde einach mal behaupten, dass ich auch bei hibernate so langsam immer mehr durchblicke...


----------



## maki (26. Sep 2007)

> also ich denke für JSF nicht.....


Das denke ich ganz sicher, wenn ich solche Ausagen lese:


> 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.


Das wird alles im JSF Phasenmodell erklärt, da sind die Grundlagen noch nicht verstanden worden. 
Mit anderen Worten: JSF ist sehr komplex, vor allem am Anfang, so wie du das schreibst, wird das nix. Erstmal die Hausaufgaben machen 

Bei JBoss/Red Hat gibt es ein Beispiel zu JSF, EJB und JPA.


----------



## Guest (26. Sep 2007)

so dazu muss ich noch was sagen ;-) vielleicht habe ich mich auch einfach schlecht ausgedrückt... 
also ich gehe davon aus, dass du mit phasenmodell den lebenszyklus meinst.... und in phase 4 ist die aktualisierung der modell-objekte. in dieser phase werden den beans die werte der komponenten zugeordnet. 

also haben die model-objekte jetzt die werte. und die 5 phase ist der aufruf der applikation. hier werden also die action events ausgelöst. damit habe ich mir schonmal eine frage selber beantwortet. in meinem kleinen beispiel löst der command button ein action-event aus und soll das objekt dann in der db speichern. deswegen or-mapping .
und dann beginne bei mir ein paar schwierigkeiten.... deswegen wäre ein jsf|hibernate beispiel sehr schön...

hört sich das denn schon ein wenig besser an oder immer noch so schlecht wie die erste formulierung  sei ehrlich ;-)


----------



## maki (26. Sep 2007)

schon besser 

Allerdings kannst du ja wohl kaum eine action oder einen actionListener so aufrufen:
value="#{UserManager.speichern}"

Dir ist der Unterschied zwischen einer action und einem actionListener klar und du weisst in welcher Phase sie jeweils ausgeführt werden und wie man die Phase bei letzterem ändern kann?

Wenn du einbischen nach Tutorials suchst, findest du bestimmt mehr als genug, google ist dein Freund.
Obwohl ich trotzdem noch der Meinung bin das man sich zuerst auf eine neue Technologie konzentrieren sollte, JSF und Hibernate auf einmal verstehen zu wollen ist sehr ambitioniert


----------



## Guest (26. Sep 2007)

ich denke das ich hiermit,   value="#{UserManager.speichern}"  ein actionevent auslöse.

naja ist ja auch egal. darum geht smir eigentlich ja gar nicht...

mir gehts eigentlich "nur" darum,  bzw. ich habe es wohl noch nicht richtig verstanden, wie jetzt das abspeichern in eine DB funktioniert.

in den ganzen tutorials geht es um java-anwendungen. da wird dann einfach zum test ein objekt erzeugt und dann abgespeichert. z.b. 

User myUser = new User();
myUser.setName("Meier");
usw....

Das kann ich auch absolut nachvollziehen. Ich habe es bloß scheinbar noch nicht verstanden wie das jetzt bei eienr Web-Anwendung ist. Daten werden ins Formular eingegeben. JSF-Lebenszyklus wird durchlaufen. und wie das dann weitergeht verstehe ich bisher nicht. 
ach keine ahnung, ich kann mich auch nur so schlecht ausdrücken.... ich gehe einfach jetzt schlafen und hoffe du kannst mich ein wenig verstehen und nochmal kurz was dazu sagen..... morgen werde ich eh weiter herumtesten...


----------



## kama (27. Sep 2007)

Hallo,



			
				Anonymous hat gesagt.:
			
		

> - 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.


Also wenn Du mit Java 5 anfängst (bitte tu dir den gefallen), dann kannst Du die Mapping-Dateien vergessen. Das geht dann mit Annotations.
Aus den Annotierten Java Objekten kann man direkt die DDL's erzeugen...(Ant hilft unwarscheinlich).

Du solltest aber die Einarbeitung in Hinbernate auch nicht unterschätzen....

Und das letzte nennt sich dann DAO....(Data Access Object). Meist werden hier Zugriffe auf die DB zusammen gefasst.

MfG
Karl Heinz Marbaise


----------



## maki (27. Sep 2007)

> Also wenn Du mit Java 5 anfängst (bitte tu dir den gefallen), dann kannst Du die Mapping-Dateien vergessen. Das geht dann mit Annotations.
> Aus den Annotierten Java Objekten kann man direkt die DDL's erzeugen...(Ant hilft unwarscheinlich).


Hallo kama,

persönlich bin ich kein Freund der Annotations die mit Java 5 kamen.

XDoclet hat auch immer sehr gut funktioniert, ausserdem find ich Java Quellcode der Annotations "verunreinigt" ist viel schwieriger zu lesen. Wenn die Annotations ala XDoclet nur im JavaDoc Kommentar wären, würde es mich gar nicht so sehr stören.

Nur meine 0.02 €


----------



## kama (27. Sep 2007)

Hallo,


			
				maki hat gesagt.:
			
		

> persönlich bin ich kein Freund der Annotations die mit Java 5 kamen.


Da kann man durchaus geteilter Meinung drüber sein....ich finde Sie gut, da viele Problemfälle von vorne herein unterbunden werden. Nicht nur mit Annotations....



			
				maki hat gesagt.:
			
		

> XDoclet hat auch immer sehr gut funktioniert, ausserdem find ich Java Quellcode der Annotations "verunreinigt" ist viel schwieriger zu lesen.



Mal als Beispiel:

```
@Entity
@Table(name = TableNames.HEADLINE)
public class HeadlineBO extends BOBase {

	private static final long serialVersionUID = 273139520364892734L;

	private String year;
	private String location;
	private String ordering;
	
	private Set<RecordBO> records;
	private Set<SongBO> songs;
	private Set<MusicianBO> arangement; //The arangement of musicians,

	
	public HeadlineBO () {
		super();
		records = new HashSet<RecordBO>();
	}

	public HeadlineBO(ContentHeadLine cm) {
		setYear(cm.getLeft());
		setLocation(cm.getMiddle());
		setOrdering(cm.getRight());
	}

	public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}

	public String getOrdering() {
		return ordering;
	}

	public void setOrdering(String ordering) {
		this.ordering = ordering;
	}

	public String getYear() {
		return year;
	}

	public void setYear(String year) {
		this.year = year;
	}

	@ManyToMany(fetch = FetchType.EAGER)
	public Set<RecordBO> getRecords() {
		return records;
	}

	public void setRecords(Set<RecordBO> records) {
		this.records = records;
	}

	public void addRecord(RecordBO rto) {
		if (this.records == null) {
			this.records = new HashSet<RecordBO>();
		}
		this.records.add(rto);
	}

	@ManyToMany(fetch = FetchType.EAGER)
	public Set<SongBO> getSongs() {
		return songs;
	}

	public void setSongs(Set<SongBO> songs) {
		this.songs = songs;
	}

	@ManyToMany(fetch = FetchType.EAGER)
	public Set<MusicianBO> getArangement() {
		return arangement;
	}

	public void setArangement(Set<MusicianBO> arangement) {
		this.arangement = arangement;
	}
        .
        .
```
Hier ist finde ich der Vorteil, dass alle Information da sind wo sie hin gehören und eben nicht in den Kommentaren. 
Es ist eben kein Kommentar. 
Und zum anderen werden die Annotations vom Compiler mit überprüft. Das ist bei XDoclet nicht der fall.
Dann muss ich bei XDoclet noch einen Build Schritt hinzufügen und daraus dann nochmal (Hibernate) XML-Mapping Dateien machen. Das brauche ich bei obigem Beispiel überhaupt nicht.
Und jeder schritt ist eben eine Fehlerquelle mehr...

MfG
Karl Heinz Marbaise


----------



## Guest (27. Sep 2007)

ich muss nochmal was fragen. ich sage euch das jetzt einfach anhand des quellcodes. habe ein ganz einfaches eingabeformular in JSF. Diese beiden Eingaben will ich mittels Hibernate in einer DB speichern. 
(Habe mal ein Tutorial bearbeitet, welches auch wunderbar geklappt hat, da erzeuge ich die Daten welche abgespeichert werden sollen in einer Testklasse)

Durch value="#{UserManager.user.name}" wird der name an Bean-Property übergeben.....
Durch value="#{UserManager.user.alter}" wird das alter an Bean-Property übergeben.....
hibernate-config.xml ist auch korrekt, da das Tutorial auch geklappt hat.
User.hbm.xml (mapping-datei) ebenfalls korrekt.

ich will einfach nur den namen und alter in einer db abspeichern.

jetzt die stelle wo ich einfach nicht verstehe wie es gehen soll (ich kapiere es einfach nicht :-()

mittels action="#{UserMansager.saveUser}" soll die Methode saveUser aufgerufen 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 will also die Werte der Beans-Properties durch die Methode saveUser abspeichern.  Ich erzeuge hier ja das Objekt meinUser und setze den Namen und das Alter. Dann will ich meinUser durch session.save(einUser) in der DB speichern.

Was ich einfach nicht kapiere, wie genau ich an die Werte aus den Properties komme, um diese dann abzuspeichern. ich hoffe ihr könnt emir kurz dazu was sagen..... 

Viele Dank...


----------



## Guest (28. Sep 2007)

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(_SharedRendererU tils.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(HtmlTextRendere rBase.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>
<hanelGrid columns="2">
<hutputLabel value="Name"></hutputLabel>
<h:inputText size="14" value="#{BenutzerHandler.user.name}"></h:inputText>
<hutputLabel value="Alter"></hutputLabel>
<h:inputText size="14" value="#{BenutzerHandler.user.alter}"></h:inputText>

<h:commandButton value="speichern"
action="#{BenutzerHandler.saveBenutzer}"></h:commandButton>
<hutputLabel></hutputLabel>
</hanelGrid>
</h:form>

Was mache ich falsch?


----------



## maki (28. Sep 2007)

> Base is null:


Be mir deuted es meist daraufhin, dass die ManagedBean nicht geladen ist.

Was steht denn in deiner config?

Da sollte zumindest die Bean Klasse, der Name (so wie sie in der JSF angesprochen wird) und der scope stehen.


----------



## Guest (28. Sep 2007)

in der faces-config.xml steht:

    <managed-bean>
    <managed-bean-name>BenutzerHandler</managed-bean-name>
    <managed-bean-class>beans.BenutzerHandler</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>

so müßte es ja eigentlich richtig sein. ist denn meine methode saveBentzer richtig?
ich erzeuge da ja ein Benutzerobjekt und will das abspeichern.....

das mapping müßte auch richtig sein..... habe so in einer javaanwendung benutzt.


----------



## maki (28. Sep 2007)

```
<managed-bean-scope>request</managed-bean-scope>
```
Bist du sicher das der request scope reicht?
Bei mir würde das sicher nicht reichen...


```
javax.faces.el.PropertyNotFoundException: Base is null: .benutzer org.apache.myfaces.el.ValueBindingImpl.resolveToBaseAndProperty(ValueBindingImpl.java:477)
```
Das ist dein Problem, wo verwendest du in einer EL (JSF) ".benutzer"?
Trotzdem ist Base noch null, siehe oben (scope -> session)



> so müßte es ja eigentlich richtig sein. ist denn meine methode saveBentzer richtig?


Wohl kaum, du erstellst dort einen neuen Benutzer, möchtest du wirklich einen leeres und neues Benutzer Objekt speichern?
Solltest du nicht eher das property "benutzer" der ManagedBean speichern, welches vorher mit den Daten gefüllt wurde?

Nochmal: Du würdest dir selbst einen großen Gefallen tun, wenn du dich zuerst mit JSF auseinandersetzen würdest, anstatt es gleich benutzen zu wollen. Ganz so einfach ist es dann doch nicht...


----------



## Guest (28. Sep 2007)

du hast wohl vollkommen recht. ich muss mich jetzt einfach erstmal intensiver mit JSF befassen. Nützt ja alles nichts. Du hast mir trotzdem weitergeholfen. Vielen Dank. Es ist aber halt öfter so bei mir, dass ich erst was machen will, bevor ich überhaupt die Grundlagen verstanden habe. Scheint wohl die falsche Taktik zu sein. ...
aber ich denke das kennt jeder.....

trotzdem, danke...


----------



## Guest (28. Sep 2007)

das muss ich noch klarstellen..

du hast geschrieben: "Das ist dein Problem, wo verwendest du in einer EL (JSF) ".benutzer"? "

ich habe das falsch gepostet. das steht nicht user, sondern benutzer....... naja dann werde ich jetzt mal lesen....


----------



## maki (28. Sep 2007)

> du hast wohl vollkommen recht. ich muss mich jetzt einfach erstmal intensiver mit JSF befassen. Nützt ja alles nichts. Du hast mir trotzdem weitergeholfen. Vielen Dank. Es ist aber halt öfter so bei mir, dass ich erst was machen will, bevor ich überhaupt die Grundlagen verstanden habe. Scheint wohl die falsche Taktik zu sein. icon_smile.gif...
> aber ich denke das kennt jeder.....


Ja, das kennt jeder, allerdings lernt man in Java nicht viel durch trial & error, da braucht man schon Grundlagen 

Wenn du dich ein bisschen reingearbeitet hast, bist du auch in der Lage konkretere Fragen zu stellen, dann fällt es uns hier etwas einfacher, dir zu helfen.
Gruß,

maki


----------

