# Hibernate erster Versuch



## der_tobi (22. Dez 2010)

Hi zusammen,

ich versuch mich grad an Hibernate mit der Datenbankanbindung. Ich mach nur ein simples Tutorial wo mit Hibernate einfach nur 3 Datensätze in eine DB schreiben soll. Selbst das klappt nicht.

meine Klasse:

```
public class FirstExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Session session = null;
		
	    try{
	    	// This step will read hibernate.cfg.xml 
	    	//	and prepare hibernate for use
	    	System.out.println("Start");
	    	
	    	SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
	    	
	    	System.out.println("Start");
	    	session =sessionFactory.openSession();
	           //	Create new instance of Contact and set 
	    	//	values in it by reading them from form object
	    	
	        System.out.println("Inserting Record");
	        Contact contact = new Contact();
	        contact.setId(3);
	        contact.setFirstName("Deepak");
	        contact.setLastName("Kumar");
	        contact.setEmail("deepak_38@yahoo.com");
	        session.save(contact);
	        System.out.println("Done");
	        
	    }catch(Exception e){
	      System.out.println(e.getMessage());
	    }
	    finally{
	      // Actual contact insertion will happen at this step
	     session.flush();
                // Bei dem Flush kommt immer die Exception
	     session.close();

	      }

	}

}
```

Beim Ausführen bekomm ich immer eine Exception:
Exception in thread "main" java.lang.NullPointerException
	at tutorial.hibernate.FirstExample.main(FirstExample.java:42)

Das ist genau bei dem Flush. So wie es aussieht scheitert er aber schon an der SessionFactory, weil er mir nichtmal das zweite "Start" auf die Konsole printet.

Datenbankserver läuft und die Datenbank "hibernatetutorial" habe ich angelegt. Die xml Files liegen alle im seleb Package wie die Java Klasse im Eclipse.

Ich würd mich freuen wenn mir jmd helfen kann, bin absoluter Neuling mit Hibernate.


Die Contact Klasse enthält einfach nur Variablen mit den Getter und Setter Methoden.

Meine hibernate.cfg.xml:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernatetutorial</property>
      <property name="hibernate.connection.username">root</property>
      <property name="hibernate.connection.password">root</property>
      <property name="hibernate.connection.pool_size">10</property>
      <property name="show_sql">true</property>
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      <property name="hibernate.hbm2ddl.auto">update</property>
      <!-- Mapping files -->
      <mapping resource="contact.hbm.xml"/>
</session-factory>
</hibernate-configuration>
[/XML]

und das contact.hbm.xml Mapping:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <class name="tutorial.hibernate.Contact" table="CONTACT">
   <id name="id" type="long" column="ID" >
   <generator class="assigned"/>
  </id>

  <property name="firstName">
  <column name="FIRSTNAME" />
  </property>
  <property name="lastName">
    <column name="LASTNAME"/>
  </property>
  <property name="email">
    <column name="EMAIL"/>
  </property>
 </class>
</hibernate-mapping>
[/XML]


----------



## ARadauer (22. Dez 2010)

Zeile 42 entspricht genau welcher Zeile in dem von dir geposteten Code?


----------



## SlaterB (22. Dez 2010)

@Aradauer
lesen 

------

in das finally gehört ein Test, ob session null ist,
durch die Exception dort wird die eigentliche Fehlermeldung, die zu eben keiner Session führt, überdeckt,

bringe die erstmal zum Vorschein indem du das finally reparierst, dann gehts weiter,
bzw. was ist denn mit Zeile 31
>   System.out.println(e.getMessage());
kommt da nix? besser e.printStackTrace();


----------



## der_tobi (22. Dez 2010)

Zeile 42 entspricht hier 35, eben das session.flush();

In das catch fährt er irgendwie nicht rein. e.printStackTrace(); habe ich dort auch noch reingeschrieben, es kommt aber nicht mehr auf der Konsole. Die Ausgabe ist:

Start
Exception in thread "main" java.lang.NullPointerException
	at tutorial.hibernate.FirstExample.main(FirstExample.java:43)

@SlaterB: Was meinst du mit finally reparieren? 
Anfangs hat ich auch mal ne Meldung das die hibernate configure und die contact.hbm.xml nicht gefunden werden, aber das kommt jetzt nicht mehr.

Das Tutorial ist von hier Writing First Hibernate Code

Danke!


----------



## SlaterB (22. Dez 2010)

> Was meinst du mit finally reparieren? 


SlaterB hat gesagt.:


> in das finally gehört ein Test, ob session null ist,


wenn du vorher prüfst fliegt keine Fehlermeldung an dieser Stelle

wobei ich im ersten Posting nicht so genau an dein try/catch gedacht habe, 
damit müsste die erste Fehlemeldung auch zu sehen sein

bei

```
public class Test
{
    public static void main(String[] args)
    {
        String session = null;
        try
        {
            if (Math.random() < 0.5)
            {
                throw new Exception("E"); // Zeile 26
            }

            session = "test";
        }
        catch (Exception e)
        {
            System.err.println("folgene Exception selber gefangen");
            e.printStackTrace();
        }
        finally
        {
            session.length(); // Zeile 38
        }

    }
}
```
kommt zu 50% gar keine Ausgabe, zu 50% aber

```
folgene Exception selber gefangen
java.lang.Exception: E
	at test.Test.main(Test.java:26)
Exception in thread "main" java.lang.NullPointerException
	at test.Test.main(Test.java:38)
```
also beide Fehlermeldungen

wenn das finally korrigiert ist kommt die zweite Exception auf jeden Fall nicht mehr,
bleibt die Frage ob du dann sonst irgendeine Info erhälst oder gar nichts mehr


----------



## KSG9|sebastian (22. Dez 2010)

Mach mal das...


```
Session session = null;

try{
   SessionFactory sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
   
   session =sessionFactory.openSession();
               
   Contact contact = new Contact();
   contact.setId(3);
   contact.setFirstName("Deepak");
   contact.setLastName("Kumar");
   contact.setEmail("deepak_38@yahoo.com");
   
   session.getTransaction().begin();
   session.save(contact);
   session.getTransaction().commit();
}  catch(Exception e){
   e.printStackTrace();
} finally{
   if(session != null){
      session.close();
   }
}
```

Genau genommen macht der catch auch kaum Sinn..theoretisch würde hier ein try{}finally{} reichen..
Wenn von Hibernate eine Exception fliegt kannst du eh nichts mehr tun...daher gar nicht erst fangen sondern durchknallen lassen..


----------



## SlaterB (22. Dez 2010)

die Alternative wäre dann übrigens 'throws Exception' an die main ranzuschreiben, kennt nicht jeder


----------



## guni (22. Dez 2010)

Hi,

hab mich vor 2 Wochen mal mit Hibernate beschäftigt. ganz unabhängig von deinem Problem: schau dir doch mal die Tutorials auf youtube an - da hat i-ein Inder ca. 18 Kurzvideos zu dem Thema gemacht. Echt von Null auf und total verständlich! Und seine Beispiele haben bei mir einwandfrei funktioniert ...
Leider kann ich den Link grad nicht posten weil die meine Firewall yt blockt (ich kann nicht nachschaun) aber du findest es sicher gleich ...

mfg, guni


----------



## der_tobi (22. Dez 2010)

@KSG9: Eclipse kennt session.getTransaction().begin(); nicht....da meckert es. es will immer in beginTransaction ändern.

@guni: Danke, werd sie mir mal anschauen!


----------



## KSG9|sebastian (22. Dez 2010)

Ups 

Dann änder es in beginTransaction bzw commitTransaction


----------

