# Einfacher Anfang mit Hibernate



## Gast77 (3. Feb 2008)

Hallo zusammen,

ich möchte mal einen Einstieg in Hibernate bekommen und habe mir dazu überlegt, dass ich einfach mal eine "DVD-Verwaltung" realisieren. Die Daten sollen jedoch nicht in einer "richtigen DB" abgelegt werden, sondern in Files der HSqlDb.

Habe dazu folgenden Code zusammengewurschtelt. Die entsprechende GUI dazu mach ich evtl. später. Mir kommt es eigentlich nur darauf an, die Daten entsprechend unter verwendetung von Hibernate und der HSqlDB in Files abzulegen.
Doch irgendwie klappt das nicht so recht... Irgendwie scheint nach Beendigung des Programms die "DB" wieder leer zu sein, und nur zur Laufzeit die Daten zur Verfügung zu stehen. 

Hier mal mein Code:


Main.java

```
package film;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;


public class Main {

	private SessionFactory sessionFactory;

	public Main() {
		try {
		      System.out.println( "------------------------------------------------------" );
		      System.out.println( "Initializing Hibernate" );
		      sessionFactory = new Configuration().configure().buildSessionFactory();
		      System.out.println( "Finished Initializing Hibernate" );
		      System.out.println( "------------------------------------------------------" );
		    } catch( HibernateException ex ) {
		      ex.printStackTrace();
		      System.exit( 5 );    
		    }
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String name = "test1";
		String genre = "Action";
		String kommentar = "Dies ist ein Kommentar";
		String aufnahme = "DreamHD";
		
		Main main = new Main();
		main.addDVD(name, genre, kommentar, aufnahme);
		main.showDVDs();
	}
	
	private void addDVD( String name, String genre, String kommentar, String aufnahme )
	  {
	    Session     sess = null;
	    Transaction trx  = null;
	    try {
	      sess = sessionFactory.openSession();
	      trx  = sess.beginTransaction();
	      Dvd dvd = new Dvd();	      
	      dvd.setName( name );
	      dvd.setGenre( genre );
	      dvd.setKommentar(kommentar);
	      dvd.setAufnahme(aufnahme);
	      sess.save( dvd );
	      trx.commit();
	    } catch( HibernateException ex ) {
	      if( trx != null )
	        try { trx.rollback(); } catch( HibernateException exRb ) {}
	      throw new RuntimeException( ex.getMessage() );
	    } finally {
	      try { if( sess != null ) sess.close(); } catch( Exception exCl ) {}
	    }
	  }

	private void showDVDs()
	  {
	    Session     sess = null;
	    Transaction trx  = null;
	    try {
	      sess = sessionFactory.openSession();
	      trx  = sess.beginTransaction();	      
	      List dvds = sess.createQuery( "from Dvd" ).list();
	      for( int i=0; i<dvds.size(); i++ ) {
	        Dvd dvd = (Dvd)dvds.get( i );
	        System.out.println( "Titel:  " + dvd.getName()
	                             + " aus der Kategorie " + dvd.getGenre()
	                             + " Kommentar:" + dvd.getKommentar()
	                             + " gespeichert: " + dvd.getAufnahme() );
	      }
	      trx.commit();
	    } catch( HibernateException ex ) {
	      if( trx != null )
	        try { trx.rollback(); } catch( HibernateException exRb ) {}
	      throw new RuntimeException( ex.getMessage() );
	    } finally {
	      try { if( sess != null ) sess.close(); } catch( Exception exCl ) {}
	    }
	  }


}
```


hibernate.cfg.xml


```
<?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="hibernate.connection.driver_class">
      org.hsqldb.jdbcDriver
    </property>
    <property name="hibernate.connection.url">
      jdbc:hsqldb:file:./hSqlDbData/myDB;shutdown=false
    </property>
    <property name="hibernate.connection.username">sa</property>
    <property name="hibernate.connection.password"></property>
    <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
    <property name="show_sql">false</property>
    <property name="transaction.factory_class">
      org.hibernate.transaction.JDBCTransactionFactory
    </property>
    <property name="hibernate.cache.provider_class">
      org.hibernate.cache.HashtableCacheProvider
    </property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <mapping resource="dvd.hbm.xml"/>   
  </session-factory>
</hibernate-configuration>
```

dvd.hbm.xml


```
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="film.Dvd" table="DVDS">
    <id name="id" column="ID" type="integer">
      <generator class="native"/>
    </id>
    <property name="name"  column="NAME"  type="string" not-null="true"/>
    <property name="genre"   column="GENRE"   type="string"/>
    <property name="kommentar"   column="KOMMENTAR"   type="string"/>
    <property name="aufnahme" column="AUFNAHME" type="string" not-null="true"/>    
  </class>
</hibernate-mapping>
```

Dvd.java


```
package film;

public class Dvd {
	  private int    id;
	  private String name;
	  private String genre;
	  private String kommentar;
	  private String aufnahme;	

	  public int    getId()      	{ return id; }
	  public String getName()    	{ return name; }
	  public String getGenre()   	{ return genre; }
	  public String getKommentar()  { return kommentar; }
	  public String getAufnahme() 	{ return aufnahme; }	 

	  public void setId(      int id      ) { this.id = id; }
	  public void setName( String name    ) { this.name = name; }
	  public void setGenre(     String  genre     ) { this.genre = genre; }
	  public void setKommentar(  String kommentar     ) { this.kommentar = kommentar; }
	  public void setAufnahme(  String aufnahme   ) { this.aufnahme = aufnahme; }	  
	}
```

Vielen Dank für eure Hilfe!!!


----------



## HoaX (3. Feb 2008)

du musst die datenbank sauber mit shutdown beenden. wurde hier schon tausendmal besprochen...


----------



## Gast77 (3. Feb 2008)

Danke. Ich muss also mit SHUTDOWN die DB beenden. Wenn ichs richtig gelesen habe, kann ich dies bei meinem Beispiel als Parameter mitgeben.

Also folgendermaßen:


```
jdbc:hsqldb:file:./hSqlDbData/myDB;shutdown=true
```

Funktioniert leider trotzdem nicht...


----------



## Gast77 (16. Feb 2008)

Hab nochmal geschaut, und mir jetzt das SQL Statement ausgeben lassen...


```
Hibernate: insert into DVDS (ID, NAME, GENRE, KOMMENTAR, AUFNAHME) values (null, ?, ?, ?, ?)
```

Da sollte doch anstelle der Fragezeichen eigentlich auch was drinstehen... Oder nicht?


----------



## HoaX (17. Feb 2008)

nein, bei prepared statemants existiert kein string in dem alle daten drin stehn. wenn du das logging anpasst bekommst du auch das binding der parameter ausgegeben.

zu shutdown: shutdown=true sagt dass die datenbank beendet wird wenn die letzte connection geschlossen wird. das connection handling übernimmt bei dir hibernate. es kann gut sein dass hibernate die verbindungen nicht ordentlich beendet. setz einfach am ende selbst ein shutdown statement ab und gut ist


----------

