# [Anfänger] Hibernate-Einstieg



## Mean (9. Mai 2008)

Hallo,

ich habe ein kleines Projekt das ich an der Uni machen muß und soll dafür Hibernate verwenden.

Ich habe allerdings nicht so die riesen Ahnung. Postgres habe ich installiert.

Meine Ordner-Struktur in Eclipse sieht so aus:



> unihb
> - src
> -- de.kundenverwaltung.db
> -- de.bestellverwaltung.db
> ...



Wenn ich das jetzt richtig verstanden habe brauche ich nun ja die persistence.xml um die Verbindung zur DB aufzubauen. Wo muß diese denn genau liegen in meinem Fall? Gibt es eine andere Möglichkeit zu testen, ob eine Verbindung zur DB aufgebaut ist, außer eine Entity fertig zu programmieren (das will ich machen, sobald ich mir sicher bin, daß die Grundlagen stimmen und ich mir dann keinen Wolf suche und am Ende liegt es an der persistence.xml).

Danke und Grüße,

Dirk


----------



## L-ectron-X (9. Mai 2008)

Neben den Klassen/Entitis, die du mappen willst machst du deine Datenbank in der hibernate.cfg.xml bekannt.
Für PostgreSQL könnte die so aussehen:

```
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

                
        <property name="connection.url">jdbc:postgresql://192.168.0.100/PostgreDB</property>
	<property name="connection.username">postgres</property>
        <property name="connection.password">postgres</property>
	<property name="connection.driver_class">org.postgresql.Driver</property> 
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>        

        
        <property name="connection.pool_size">1</property>

        
        <property name="current_session_context_class">thread</property>

        
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        
        <property name="show_sql">true</property>

        
         

        <mapping resource="Kunden.hbm.xml"/>
        <mapping resource="Bestellung.hbm.xml"/>

    </session-factory>

</hibernate-configuration>
```

Wenn die Verbindung dorthin nicht klappt, bekommst du Fehlermeldungen.


----------



## byte (9. Mai 2008)

Mach doch einfach Schritt für Schritt die "First Steps" der Hibernate Doku:
http://www.hibernate.org/hib_docs/v3/reference/en/html/


----------



## Mean (12. Mai 2008)

Hallo,

vielen Dank für eure Antworten!

Ich habe jetzt ein Beispiel unseres Profs gefunden. Da ist das so weit mit der persistence.xml strukturiert,...

Ich hätte jetzt aber noch eine andere Frage: Ich habe jetzt eine Beispiel Entity erstellt @Entity @Tabel(name="kunde"),... und würde nun gerne testen, ob ich die über die Datenbank befüllen kann.

Wo kann ich denn einen Query eingeben, daß nur damit eine Instanz von Kunde angelegt und gefüllt wird? Ich will jetzt nicht in main ein neues Objekt anlegen, da ich später ja auch andere Entities habe und das dann jedes Mal so zu testen wäre wohl etwas sehr umständlich?!?!

Gibt es da eine Möglichkeit?

Danke und Grüße,

Dirk


----------



## semi (12. Mai 2008)

Installiere die Hibernate-Tools. Gehe dazu in den Update-Manager von Eclipse und
trage dort die folgende Seite ein

Name: Hibernate-Tools
URL: http://download.jboss.org/jbosside/updates/development

Von dem ganzen brauchst du nur die Hibernate-Tools, den Rest kannst du ignorieren.






Öffne dann nach der Installation die Hibernate-Perspektive (Window->Open Perspective->...)
und erstelle eine Konfiguration für dein Projekt. (evtl. noch unter Classpath einen passenden
JDBC Treiber eintragen)
Unter Persistence Unit musst du eine PU aus deiner persistence.xml eintragen. Rest sollte klar sein.





Danach klappst du das ganze auf und öffnest einen HQL-Editor. Dort kannst du mit verschiedenen 
Queries experimentieren.

Du kannst (solltest du auch) JUnit-Tests schreiben, über die du dann die Entities testen kannst.
Wenn du am Ende der Tests Rollback machst, bleibt deine DB unverändert.


----------



## Mean (12. Mai 2008)

Hi semi,

vielen Dank für die ausführliche Beschreibung.

Im Moment habe ich noch das Problem, daß ich den Fehler bekomme "Could not load JPA configuration".

Und beim Registerreiter "Hibernate Dynamic SQL Preview" kommt "No HQL Query Editor selected".

Kannst mir da vielleicht helfen?

Vielen Dank und Grüße,

Dirk


----------



## semi (12. Mai 2008)

Hat dien Projekt eine gültige persistence.xml? Solange Session Factory nicht korrekt initialisiert 
wird, ist der HQL Editor nicht verwendbar. Achte darauf, dass du in der Konfiguration den korrekten
Namen bei Persistence Unit einträgst und dass "JPA (jdk1.5+)" selektiert ist.
Das ganze sollte dann direkt funktionieren.

Der zweiten Fehler kommt manchmal auch, wenn man den Cursor noch nicht in den HQL Editor 
gesetzt hat bzw. die Konfiguration in der ComboBox nicht ausgewählt ist.

Eigentlich sollte forgendes in persistence.xml ausreichen, um Queries ohne Datenbank zu schreiben
	
	
	
	





```
<persistence-unit name="PostgresPU">
   <provider>org.hibernate.ejb.HibernatePersistence</provider>
   <properties>
      <property name="hibernate.archive.autodetection" value="class" />
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
   </properties>
</persistence-unit>
```


----------



## Mean (12. Mai 2008)

Hallo semi,

danke erstmal, das mit der persistence-unit hatte ich falsch, habe ich jetzt aber aus der XML gelesen.

So sieht meine persistence.xml aus (sollte eigentlich gehen, da Beispiel vom Prof):


```
<?xml version="1.0" encoding="ISO-8859-1"?>





<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">

	<persistence-unit name="HibernateExample" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		
		<class>proj.hs.kundenverwaltung.db.Kunde</class>
		<class>proj.hs.lieferverwaltung.db.Bestellung</class>
		<class>proj.hs.lieferverwaltung.db.Lieferung</class>
	</persistence-unit>
</persistence>
```

Kann es vielleicht daran liegen, daß in der persistence.xml Klassen stehen, die ich noch gar nicht habe?

Danke und Grüße,

Dirk


----------



## semi (12. Mai 2008)

Ja, es fehlt mindestens noch Dialect. Die Entity-Klassen werden automatisch erkannt/gefunden.
Ersetze es am besten durch das hier
	
	
	
	





```
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
   <persistence-unit name="HibernateExample">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <properties>
         <property name="hibernate.archive.autodetection" value="class" />
         <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
      </properties>
   </persistence-unit>
</persistence>
```
Man kann jede Klasse einzeln benennen, das ist aber unnötig, wenn man "hibernate.archive.autodetection" verwendet.

PS: oder besser durch das hier (Host, Datenbanknamen, User und Passwort anpassen)
Vergiss nicht den JDBC-Treiber unter Classpath in der Hibernate-Konfiguration einzutragen.
	
	
	
	





```
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
   <persistence-unit name="HibernateExample">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <properties>
         <property name="hibernate.archive.autodetection" value="class" />
         <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />

         <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
         <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/deinedb" />
         <property name="hibernate.connection.username" value="user" />
         <property name="hibernate.connection.password" value="password" />
         <property name="hibernate.connection.pool_size" value="1" />
      </properties>
   </persistence-unit>
</persistence>
```


----------



## Mean (12. Mai 2008)

Hallo semi,

danke! Was mir gerade in meinen Unterlagen aufgefallen ist, ich habe Postgres noch gar nicht im Data Source Editor eingestellt. Das wollte ich jetzt machen, allerdings kann er nicht pingen und bringt mir beim Versuch darauf zu connecten folgenden Fehler:



> Creating PostgresSQL JDBC Connection Factory connection to postgres
> Creating SQL Model connection connection to postgres
> Creating connections to postgres



Und zwar heißt mein Datenbankserver postgres und ich habe dann bei der URL jdbcostgresqlostgres

Stimmt das?

Denke, ich muß erstmal das hinbekommen, ehe ich den HQL verwenden kann?!?!

Danke und GRüße,

Dirk


----------



## semi (12. Mai 2008)

Mean hat gesagt.:
			
		

> Denke, ich muß erstmal das hinbekommen, ehe ich den HQL verwenden kann?!?!


Das brauchst du nicht unbedingt. Mit Postgres habe ich noch nie was zu tun gehabt, aber das Format von URL 
ist immer wieder gleich/ähnlich, egal was für Server dahinter steckt.
	
	
	
	





```
<protocol>:<subprotocol>:<resource>
```
Das hier sollte funktionieren, wenn der Server auf gleichem PC läuft (localhost) und deine Datenbank auch 
tatsächlich 'postgres' heisst.
	
	
	
	





```
jdbc:postgresql:postgres
```

Passe einfach die persistence.xml, wie oben beschrieben, an und teste den HQL Editor.


----------



## Mean (12. Mai 2008)

Danke! Das mit dem Treiber hat nicht funktioniert...

Das mit der persistence.xml leider auch nicht.

Der Postgres-Server läuft definitiv (Prozess postgress.exe). K.A., woran das liegt. Ich denke, da muß ich mal am Di in 1 WOche zu meinem Prof...

Sorry, wenn ich dich jetzt so "abhacke", aber ist für dich auch scheiße irgendwas zu sagen, wenn nichts Vorort daran schauen kannst und ich kenne mich auch zuuu wenig aus...

Ich melde mich nochmal, wenn's geht - so lange schreibe ich die Entities halt mal ins Blaue...

Danke und Grüße,

Dirk


----------



## Mean (25. Mai 2008)

Hallo,

mein JPA, als auch der HQL-Editor laufen jetzt. Wollte mich nochmals für die zahlreiche Hilfe bedanken!

Meiner Meinung nach ist in semis persistence.xml noch ein Fehler (falls die jemand nutzen will) und zwar fehlt da, wenn ich sie mit meiner abgleiche 


```
<persistence-unit name="projectPersistence" transaction-type="RESOURCE_LOCAL">
```

Möglicherweise braucht man das in der Form die semi vorgeschlagen hat aber auch nicht - vielleicht ist's ein Versuch wert, falls es nicht klappt 

Danke nochmals und Grüße,

Dirk


----------

