BugBlog.de

Der Debugger Blog fuer Entwickler und Developer

Java Tutorial: Hibernate, MySQL, XML

November23

Hibernate Struktur Mit Hibernate ist es möglich, Objekte direkt in der Datenbank abzulegen. Dieses Beispiel soll einfach mal ein funktionierendes Beispiel beschreiben ohne dabei zu sehr in die Tiefe zu gehen. Für die Tiefe gibt es später eine Reihe weiterer guter Webseiten und Bücher.

Systemvoraussetzungen: MySQL Datenbank, Java 5 oder höher, Entwicklungsumgebung mit XML und Java Support, JDBC MySQL Treiber, Hibernate Core, Hibernate Annotations sollte man alles bei der Suchmaschine seines Vertrauens finden können.

Bei den Bezeichnungen der einzelnen Dateien orientiere ich mich an der obigen Grafik. Um uns späteren Ärgern zu ersparen sollte man zuerst die ganzen JARs in sein Projekt einbinden. Normalerweise sollte man immer so wenig einbinden aber da uns die Performance im Moment egal ist und wir erstmal nur sehen wollen wie es funktioniert, binden wir wahllos alles ein.

Als nächstes brauchen wir ein Objekt, den Tisch.

JAVA:
  1. // File: Tisch.java
  2.  
  3. package obj;
  4.  
  5. import java.io.Serializable;
  6. import java.text.MessageFormat;
  7.  
  8. public class Tisch implements Serializable{
  9.  
  10.     private static final long serialVersionUID = 1L;
  11.  
  12.     private Integer id;
  13.     private Integer Fuesse;
  14.     private String Material;
  15.     private Tisch tisch;
  16.    
  17.     public Tisch(){}
  18.    
  19.     private Integer getId() {return id;}
  20.  
  21.     private void setId(Integer id) {this.id = id;}
  22.  
  23.     public Integer getFuesse() {return Fuesse;}
  24.  
  25.     public void setFuesse(Integer fuesse) {Fuesse = fuesse;}
  26.  
  27.     public String getMaterial() {return Material;}
  28.  
  29.     public void setMaterial(String material) {this.Material = material;}
  30.  
  31.     private Tisch getTisch() {return tisch;}
  32.  
  33.     private void setTisch(Tisch tisch) {this.tisch = tisch;}
  34.    
  35.     public String toString() {
  36.         return MessageFormat.format("{0}: Fuesse={1}, Material={2}", new Object[] {
  37.                 getClass().getSimpleName(), Fuesse, Material });
  38.     }
  39. }

Aus Gründen der Übersichtlichkeit habe ich den Code hier etwas zusammengefasst. Anschließend müssen wir mittels XML sagen wie der Tisch in unserer Datenbank gemapped werden soll.

XML:
  1. <!-- File: Tisch.hbm.xml -->
  2.  
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="obj">
  6.   <class name="Tisch" table="tische">
  7.     <id name="id">
  8.          <generator class="native" />
  9.     </id>
  10.     <property name="fuesse" type="integer"></property>
  11.     <property name="material" type="string"></property>
  12.   </class>
  13. </hibernate-mapping>

Damit später nur eine Verbindung zur Datenbank vorhanden ist muss man die Session als Singleton implementieren.

JAVA:
  1. // File: SingSessionFactory.java
  2.  
  3. package hibe;
  4.  
  5. import org.hibernate.SessionFactory;
  6. import org.hibernate.cfg.Configuration;
  7.  
  8. public class SingSessionFactory {
  9.  
  10.     private static org.hibernate.SessionFactory sessionFactory;
  11.    
  12.     private SingSessionFactory() {}
  13.     static {
  14.  
  15.         final Configuration cfg = new Configuration();
  16.         cfg.configure("/hibernate.cfg.xml");
  17.         cfg.buildSessionFactory();
  18.         sessionFactory = cfg.buildSessionFactory();
  19.     }   
  20.    
  21.     public static SessionFactory getInstance() {
  22.         return sessionFactory;
  23.     }
  24. }

Anschließend können wir unsere Main implementieren.

JAVA:
  1. // File: HibeMySQL.java
  2.  
  3. package exa;
  4.  
  5. import hibe.SingSessionFactory;
  6. import org.apache.log4j.Logger;
  7. import org.hibernate.Session;
  8. import org.hibernate.Transaction;
  9.  
  10. import obj.Tisch;
  11.  
  12. public class HibeMySQL {
  13.  
  14.     private static Logger log = Logger.getLogger(HibeMySQL.class);
  15.    
  16.     public static void main(String[] args) {
  17.         Tisch wohnzimmer = new Tisch();
  18.         wohnzimmer.setMaterial("Eiche");
  19.         wohnzimmer.setFuesse(3);
  20.        
  21.         Session ses = SingSessionFactory.getInstance().getCurrentSession();
  22.         Transaction tx = ses.beginTransaction();
  23.        
  24.         ses.save(wohnzimmer);
  25.        
  26.         tx.commit();
  27.     }
  28. }

Am Schluss brauchen wir noch zwei Konfigurationsdateien. Die erste für Hibernate und der MySQL Verbindung.

XML:
  1. <!-- File: hibernate.cfg.xml -->
  2.  
  3. <?xml version='1.0' encoding='UTF-8'?>
  4. <!DOCTYPE hibernate-configuration PUBLIC
  5.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  6.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  7.  
  8. <hibernate-configuration>
  9.   <session-factory>
  10.     <!--  MySQL connection -->
  11.       <property name="connection.url">jdbc:mysql://localhost:3306/bank</property>
  12.       <property name="connection.username">root</property>
  13.       <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  14.       <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  15.       <property name="connection.password"></property>
  16.  
  17.     <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
  18.     <property name="current_session_context_class">thread</property>
  19.     <property name="transaction.auto_close_session">true</property>
  20.    
  21.     <!-- this will show us all sql statements -->
  22.     <property name="show_sql">true</property>
  23.     <!-- this will create the database tables for us -->
  24.     <property name="hbm2ddl.auto">update</property>
  25.     <mapping resource="obj/Tisch.hbm.xml" />
  26.   </session-factory>
  27. </hibernate-configuration>

Als letztens brauchen wir noch eine Konfiguration für Log4j damit wir eine schöne Ausgabe erhalten was die Datenbank so treibt.

XML:
  1. # File: log4j.properties
  2.  
  3. ### direct log messages to stdout ###
  4. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  5. log4j.appender.stdout.Target=System.out
  6. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  7. log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
  8.  
  9. ### direct messages to file hibernate.log ###
  10. #log4j.appender.file=org.apache.log4j.FileAppender
  11. #log4j.appender.file.File=hibernate.log
  12. #log4j.appender.file.layout=org.apache.log4j.PatternLayout
  13. #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
  14.  
  15. ### set log levels - for more verbose logging change 'info' to 'debug' ###
  16.  
  17. log4j.rootLogger=debug, stdout
  18.  
  19. log4j.logger.org.hibernate=info
  20. #log4j.logger.org.hibernate=debug
  21.  
  22. ### log HQL query parser activity
  23. #log4j.logger.org.hibernate.hql.ast.AST=debug
  24.  
  25. ### log just the SQL
  26. log4j.logger.org.hibernate.SQL=debug
  27.  
  28. ### log JDBC bind parameters ###
  29. log4j.logger.org.hibernate.type=info
  30. #log4j.logger.org.hibernate.type=debug
  31.  
  32. ### log schema export/update ###
  33. log4j.logger.org.hibernate.tool.hbm2ddl=info
  34.  
  35. ### log HQL parse trees
  36. #log4j.logger.org.hibernate.hql=debug
  37.  
  38. ### log cache activity ###
  39. log4j.logger.org.hibernate.cache=info
  40.  
  41. ### log transaction activity
  42. #log4j.logger.org.hibernate.transaction=debug
  43.  
  44. ### log JDBC resource acquisition
  45. #log4j.logger.org.hibernate.jdbc=debug
  46.  
  47. ### enable the following line if you want to track down connection ###
  48. ### leakages when using DriverManagerConnectionProvider ###
  49. #log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

Die Konfigurationseinstellungen sind zum größten Teil aus anderen Beispielen entliehen. Es geht hier prinzipiell nur darum mal ein ein einfaches Beispiel zu zeigen.

Tags: , , , , , , , , ,
eBook: Java Tutorial: Hibernate, MySQL, XML eBook: Java Tutorial: Hibernate, MySQL, XML




Email will not be published

Website example

Your Comment: