-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 13 posts ] 
Author Message
 Post subject: Newbie kriegt kein Annotation Mapping zum Laufen
PostPosted: Wed Jun 11, 2008 3:51 am 
Hallo, ich habe folgendes Problem:
Ich möchte momentan nur eine kleine Tabelle in MySQL 5.0.51a mit Hibernate ansprechen. Die Tabelle Halle hat zwei Attribute, Name (VARCHAR) und id(INTEGER).
Ich habe mir aus der Uni Bibliothek das Hibernate Praxisbuch von Sebastian Hennebrüder ausgeliehen und versuche daher, das Annotation Mapping zu erstellen, das klappt aber nicht, ich kriege eine MappingException.
Ich habe auch schon auf der hibernate.org Seite unter "Documentation - getting started - I want to learn Hibernate Annotations!" das dort angesprochene PDF angeschaut, auf Seite 33 ist ein Codebeispiel, die Annotations daraus liefern bei mir aber auch denselben Fehler.
Momentan bin ich ziemlich ratlos, da ich ja grade erst mit Hibernate anfange und daher keine Erfahrung damit habe.

Meine Klassen:

Halle.java
Code:
import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Halle implements Serializable{
   /**
    *
    */
   private static final long serialVersionUID = 1L;
   private String name;
   @Id
   @GeneratedValue
   @Column(name = "idHalle")
   private Integer id;
   
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public Integer getId() {
      return id;
   }

   public void setId(Integer id) {
      this.id = id;
   }

   public Halle() { }

   public String toString() {
      return "Halle / Gebäude: " + name + ", ID: " + id;
   }
   
}


InitSessionFactory.java (aus dem Buch übernommen)
Code:


import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
* @author hennebrueder This class garanties that only one single SessionFactory
*         is instanciated and that the configuration is done thread safe as
*         singleton. Actually it only wraps the Hibernate SessionFactory. When
*         a JNDI name is configured the session is bound to to JNDI, else it is
*         only saved locally. You are free to use any kind of JTA or Thread
*         transactionFactories.
*/
public class InitSessionFactory {

   /** The single instance of hibernate SessionFactory */
   private static org.hibernate.SessionFactory sessionFactory;

   /**
     * Default constructor. It is private to guaranty singleton
     */
   private InitSessionFactory() {
   }

   static {

      final Configuration cfg = new Configuration();
      // final AnnotationConfiguration cfg = new AnnotationConfiguration();
      /*
         * change the cfg to a annotation configuration, if you want to use
         * Hibernate annotations as well. Annotation configuration supports both
         * XML and annotations
         */

      /*
         * configure Hibernate from hibernate.cfg.xml. This is expected to be in
         * the class path = "src folder" = "root folder of classes"
         */
      cfg.configure("/hibernate.cfg.xml");
      cfg.buildSessionFactory();
      sessionFactory = cfg.buildSessionFactory();

   }

   /**
     * Returns the single instance of the session factory
     *
     * @return
     */
   public static SessionFactory getInstance() {
      return sessionFactory;
   }

}


Test.java
Code:
import java.util.Iterator;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class Test {

   public static void main(String args[]) {
      try {
         createHalle();
         showHallen();
         deleteHalle();
      } catch (RuntimeException e) {
         try {
            Session session = InitSessionFactory.getInstance().getCurrentSession();
            if (session.getTransaction().isActive()) {
               session.getTransaction().rollback();
            }
         } catch (HibernateException ex) {
            System.out.println("Error rolling back Transaction");
         }
         throw e;
      }
   }

   private static void createHalle() {
      Halle halle = new Halle();
      halle.setName("Halle 57");
      Session session = InitSessionFactory.getInstance().getCurrentSession();
      Transaction tx = session.beginTransaction();
      session.save(halle);
      tx.commit();
   }
   
   private static void deleteHalle() {
      Halle halle = new Halle();
      halle.setName("Halle 57");
      Session session = InitSessionFactory.getInstance().getCurrentSession();
      Transaction tx = session.beginTransaction();
      tx.commit();
   }

   private static void showHallen() {
      Session session = InitSessionFactory.getInstance().getCurrentSession();
      Transaction tx = session.beginTransaction();
      List hallen = session.createQuery("select h from Halle as h").list();
      for ( Iterator iter = hallen.iterator(); iter.hasNext();) {
         Halle halle = (Halle) iter.next();
         System.out.println(halle);
      }
      tx.commit();
   }
   
}


hibernate.cfg.xml
Code:
<?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:mysql://localhost/xxx
      </property>
      <property name="connection.username">xxx</property>
      <property name="connection.password">xxx</property>
      <property name="connection.driver_class">
         com.mysql.jdbc.driver
      </property>
      <property name="dialect">
         org.hibernate.dialect.MySQLDialect
      </property>
      <property name="cache.provider_class">
         org.hibernate.cache.EHCacheProvider
      </property>
      <property name="current_session_context_class">thread</property>
      <property name="hibernate.transaction.factory_class">
         org.hibernate.transaction.JDBCTransactionFactory
      </property>
      <property name="hibernate.hbm2dll.auto">auto</property>
      <mapping class="Halle" />
   </session-factory>
</hibernate-configuration>


Exception:
Code:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" java.lang.ExceptionInInitializerError
   at Test.createHalle(Test.java:31)
   at Test.main(Test.java:12)
Caused by: org.hibernate.MappingException: An AnnotationConfiguration instance is required to use <mapping class="Halle"/>
   at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1606)
   at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1561)
   at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1540)
   at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1514)
   at org.hibernate.cfg.Configuration.configure(Configuration.java:1434)
   at InitSessionFactory.<clinit>(InitSessionFactory.java:39)
   ... 2 more


Top
  
 
 Post subject:
PostPosted: Wed Jun 11, 2008 4:17 am 
OK, ich war ein wenig dämlich, in der Klasse InitSessionFactory muss mann, wenn man Annotations nutzen will, für Zeile 27 und 28 die Kommentare ändern (also die eine kommentieren, die andere auskommentieren), dann meckert er zumindest schonmal da nicht mehr rum.
Das ganze sieht jetzt also so aus:

InitSessionFactory:
Code:
public class InitSessionFactory {

   /** The single instance of hibernate SessionFactory */
   private static org.hibernate.SessionFactory sessionFactory;

   /**
     * Default constructor. It is private to guaranty singleton
     */
   private InitSessionFactory() {
   }

   static {

      //final Configuration cfg = new Configuration();
      final AnnotationConfiguration cfg = new AnnotationConfiguration();
      /*
         * change the cfg to a annotation configuration, if you want to use
         * Hibernate annotations as well. Annotation configuration supports both
         * XML and annotations
         */

      /*
         * configure Hibernate from hibernate.cfg.xml. This is expected to be in
         * the class path = "src folder" = "root folder of classes"
         */
      cfg.configure("/hibernate.cfg.xml");
      cfg.buildSessionFactory();
      sessionFactory = cfg.buildSessionFactory();

   }

   /**
     * Returns the single instance of the session factory
     *
     * @return
     */
   public static SessionFactory getInstance() {
      return sessionFactory;
   }

}


Damit bekomme ich jetzt folgende Exception:
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
   at org.hibernate.cfg.annotations.Version.<clinit>(Version.java:12)
   at org.hibernate.cfg.AnnotationConfiguration.<clinit>(AnnotationConfiguration.java:68)
   at InitSessionFactory.<clinit>(InitSessionFactory.java:28)
   at Test.createHalle(Test.java:31)
   at Test.main(Test.java:12)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
   at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
   at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
   ... 5 more


Top
  
 
 Post subject:
PostPosted: Wed Jun 11, 2008 4:19 am 
OK, ich war ein wenig dämlich, in der Klasse InitSessionFactory muss mann, wenn man Annotations nutzen will, für Zeile 27 und 28 die Kommentare ändern (also die eine kommentieren, die andere auskommentieren), dann meckert er zumindest schonmal da nicht mehr rum.
Das ganze sieht jetzt also so aus:

InitSessionFactory:
Code:
public class InitSessionFactory {

   /** The single instance of hibernate SessionFactory */
   private static org.hibernate.SessionFactory sessionFactory;

   /**
     * Default constructor. It is private to guaranty singleton
     */
   private InitSessionFactory() {
   }

   static {

      //final Configuration cfg = new Configuration();
      final AnnotationConfiguration cfg = new AnnotationConfiguration();
      /*
         * change the cfg to a annotation configuration, if you want to use
         * Hibernate annotations as well. Annotation configuration supports both
         * XML and annotations
         */

      /*
         * configure Hibernate from hibernate.cfg.xml. This is expected to be in
         * the class path = "src folder" = "root folder of classes"
         */
      cfg.configure("/hibernate.cfg.xml");
      cfg.buildSessionFactory();
      sessionFactory = cfg.buildSessionFactory();

   }

   /**
     * Returns the single instance of the session factory
     *
     * @return
     */
   public static SessionFactory getInstance() {
      return sessionFactory;
   }

}


Damit bekomme ich jetzt folgende Exception:
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
   at org.hibernate.cfg.annotations.Version.<clinit>(Version.java:12)
   at org.hibernate.cfg.AnnotationConfiguration.<clinit>(AnnotationConfiguration.java:68)
   at InitSessionFactory.<clinit>(InitSessionFactory.java:28)
   at Test.createHalle(Test.java:31)
   at Test.main(Test.java:12)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
   at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
   at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
   ... 5 more


Top
  
 
 Post subject:
PostPosted: Wed Jun 11, 2008 4:52 am 
OK, ich habs jetzt geschafft die fehlenden jars zu finden und einzubinden, jetzt bekomme ich folgendes:
Exception in thread "main" java.lang.UnsupportedOperationException: The user must supply a JDBC connectionException in thread "main" java.lang.UnsupportedOperationException: The user must supply a JDBC connection
Ich hab hier jemanden gefunden, der dasselbe Problem hat. http://saloon.javaranch.com/cgi-bin/ubb ... 8&t=003604
Dort wird vorgeschlagen, Annotations zu verwenden, anstatt die Session Factory selbst zu implementieren (so verstehe ich das zumindest). Aber die Basis bildet immer noch das Buch von Herrn Hennebrüder, der das so verwendet. Ich weiß momentan nicht wirklich, wie ich jetzt anfangen soll mit Hibernate zu arbeiten, wenn selbst die Grundlagen Exceptions noch und nöcher schmeißen und das alles irgendwie relativ undurchsichtig noch für mich ist :(


Top
  
 
 Post subject:
PostPosted: Wed Jun 11, 2008 6:36 am 
Keiner mal nen Tip? Ich bin völlig verzweifelt, das kann doch nicht so schwer sein, oder?


Top
  
 
 Post subject:
PostPosted: Thu Jun 12, 2008 3:00 am 
Pro
Pro

Joined: Tue Jun 12, 2007 4:13 am
Posts: 209
Location: Berlin, Germany
ferrari2k wrote:
:
Exception in thread "main" java.lang.UnsupportedOperationException: The user must supply a JDBC connectionException in thread "main" java.lang.UnsupportedOperationException: The user must supply a JDBC connection

Hi,
das hört sich für mich danach an, dass du keine Konfiguration der Datenbankverbindung in

Code:
cfg.configure("/hibernate.cfg.xml");


angegeben hast.
Z.B.:

Code:
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ballaballa</property>

<property name="hibernate.connection.username">user</property>
<property name="hibernate.connection.password">pword</property>


Carlo
----------------------------------
please credit me if this post helped you


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 12, 2008 8:17 am 
Ist aber in meiner cfg drin. Ich habs jetzt auch hingekriegt, bin mal von Grund auf mit einem anderen Tutorial angefangen und kann schonmal in die Datenbank schreiben und lesen, aber löschen kann ich noch nicht.
Das hier angegebene Verfahren funktioniert bei mir nicht. Aber gut, da beiß ich mich auch noch durch :)
Jetzt muss ich mich da erstmal einarbeiten und verstehen, was ich wann wie wo einzusetzen habe und warum was nicht läuft ;)


Top
  
 
 Post subject:
PostPosted: Fri Jun 13, 2008 6:44 am 
OK, ich bin jetzt soweit, dass ich zumindest mal verstanden hab, welche jar Files ich importieren muss, damit ein normales Hibernate Projekt läuft. Jetzt habe ich mir momentan das zusammengebastelt, und das läuft auch. Hibernate ohne Annotation, mit XML Mapping für MySQL.

hibernate.cfg.xml:
Code:
<?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">XXX</property>
      <property name="hibernate.connection.password">XXX</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"/>
<!--      <mapping class="roseindia.tutorial.hibernate.Halle"/>-->
</session-factory>
</hibernate-configuration>


contact.hbm.xml
Code:
<?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="Contact" table="CONTACT">
   <id name="id" type="long" column="ID" >
   <generator class="increment"/>
  </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>


Contact.java
Code:


/**
* @author Deepak Kumar
*
* Java Class to map to the datbase Contact Table
*/
public class Contact {
   private String firstName;
   private String lastName;
   private String email;
   private long id;

   /**
    * @return Email
    */
   public String getEmail() {
      return email;
   }

   /**
    * @return First Name
    */
   public String getFirstName() {
      return firstName;
   }

   /**
    * @return Last name
    */
   public String getLastName() {
      return lastName;
   }

   /**
    * @param string
    *            Sets the Email
    */
   public void setEmail(String string) {
      email = string;
   }

   /**
    * @param string
    *            Sets the First Name
    */
   public void setFirstName(String string) {
      firstName = string;
   }

   /**
    * @param string
    *            sets the Last Name
    */
   public void setLastName(String string) {
      lastName = string;
   }

   /**
    * @return ID Returns ID
    */
   public long getId() {
      return id;
   }

   /**
    * @param l
    *            Sets the ID
    */
   public void setId(long l) {
      id = l;
   }

}


FirstExample.java
Code:


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


/**
* @author Deepak Kumar
*
* http://www.roseindia.net Hibernate example to inset data into Contact table
*/
public class FirstExample {
   public static void main(String[] args) {
      Session session = null;

      try {
         // This step will read hibernate.cfg.xml

         // and prepare hibernate for use
         SessionFactory sessionFactory = new

         Configuration().configure().buildSessionFactory();
         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.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();
         session.close();
      }
   }
}


Ach ja, und die verwendeten Jar Files:
asm.jar
cglib-2.1.3.jar
commons-collections-2.1.1.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
hibernate3.jar
jta.jar
mysql-connector-java-5.1.6-bin.jar

Die meisten Dateien sind aus dem Hibernate/lib Verzeichnis, bis auf hibernate3.jar, das ist aus dem Hibernate Hauptverzeichnis und woher der MySQL Connector kommt, sollte klar sein ;)


Last edited by ferrari2k on Fri Jun 13, 2008 7:08 am, edited 1 time in total.

Top
  
 
 Post subject:
PostPosted: Fri Jun 13, 2008 6:52 am 
So. jetzt folgendes, ich möchte gerne Annotations verwenden, aber das funktioniert nicht, ich kriege einfach eine Exception in Main, ohne Stack trace und sowas.
Was ich gemacht habe: In der hibernate.cfg.xml das mapping auf <mapping class="Contact" /> geändert.
Die contact.hbm.xml kann dann natürlich gelöscht werden.
Hinzufügen folgender jars, um im weiteren Verlauf keine Fehler zu bekommen:
hibernate-annotations.jar
ejb3-persistence.jar
hibernate-commons-annotations.jar
hibernate-core.jar

Alle aus dem Hibernate-Annotations/lib Verzeichnis, bis auf hibernate-annotations, das liegt im Hauptverzeichnis.

Hinzufügen von @Entity in Contact.java, Import von javax.persistence.Entity.
Hinzufügen von @Id in Contact.java, Import von javax.persistence.Id.

OK, wenn ich das jetzt versuche laufen zu lassen, kommt ein Fehler (logisch, ich habe bewusst noch den letzten Schritt nicht gemacht).

An AnnotationConfiguration instance is required to use <mapping class="Contact"/>

OK, was er haben will, soll er kriegen, Änderung in der FirstExample.java von Configuration auf AnnotationConfiguration, sowohl im Import als auch im Quelltext (tritt nur einmal auf).

Jetzt nochmal starten:
Code:
Exception in thread "main" java.lang.NullPointerException at FirstExample.main(FirstExample.java:39)


Also mal in Zeile 39 geschaut:
session.flush();
Hm, hilft mir nicht weiter, also Debug (neuer Post)


Top
  
 
 Post subject:
PostPosted: Fri Jun 13, 2008 6:59 am 
So, jetzt starte ich die Debug Session, Breakpoint ist die erste Anweisung in main, Session session = null;
Da geht er schön drüber, aber beim nächsten Schritt springt er gleich zu session.flush, was auch die NullPointerException erklärt, denn er hat ja noch garkeine Session.
Der nächste Schritt wäre:
SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

Jetzt die abschließende Frage, was mache ich falsch, was kann ich anders machen, was hab ich nicht verstanden, wo liegt mein Denkfehler? ;)


Top
  
 
 Post subject:
PostPosted: Fri Jun 13, 2008 7:00 am 
So, jetzt starte ich die Debug Session, Breakpoint ist die erste Anweisung in main, Session session = null;
Da geht er schön drüber, aber beim nächsten Schritt springt er gleich zu session.flush, was auch die NullPointerException erklärt, denn er hat ja noch garkeine Session.
Der nächste Schritt wäre:
SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

Jetzt die abschließende Frage, was mache ich falsch, was kann ich anders machen, was hab ich nicht verstanden, wo liegt mein Denkfehler? ;)


Top
  
 
 Post subject:
PostPosted: Fri Jun 13, 2008 7:00 am 
So, jetzt starte ich die Debug Session, Breakpoint ist die erste Anweisung in main, Session session = null;
Da geht er schön drüber, aber beim nächsten Schritt springt er gleich zu session.flush, was auch die NullPointerException erklärt, denn er hat ja noch garkeine Session.
Der nächste Schritt wäre:
SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

Jetzt die abschließende Frage, was mache ich falsch, was kann ich anders machen, was hab ich nicht verstanden, wo liegt mein Denkfehler? ;)


Top
  
 
 Post subject:
PostPosted: Fri Jun 13, 2008 7:40 am 
So, ich habs hingekriegt. Ich habe den kompletten try - catch Block auskommentiert, bis auf die eine Anweisung, bei der er mir rausgesprungen ist. Und prompt gabs auch schon ne neue Exception, ihm fehlte noch eine Klasse, slf4j-api.jar.
Naja, soll er kriegen, dann fehlte ein slf4j Logger, den hab ich im Internet gefunden, eingebunden, Datenbank geleert, geht.
Jetzt hab ich wenigstens ne vernünftige Basis, von der ich arbeiten kann. Nur würde ich gerne wissen, was dieses slf4j ist, dass er das unbedingt braucht.
Und warum der try-catch Block diese Exception nicht abgefangen hat, es stand ja Exception e drin, das müsste doch für alles gelten, oder?


Top
  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 13 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.