… es geht vorran
Ab September diesen Jahres werde ich wohl 100km nördlich von hier wohnen, vorrübergehend zumindest...
Bis dahin muss ich mir aber noch viel im Bereich der Bildverarbeitung beibringen...
Serialisierung von Java Objekten mit Hibernate II
Heute will ich noch kurz auf die Deserialisierung der Objekte eingehen, die wir im 1. Teil des Tutorials in die Datenbank geschrieben haben, eingehen. In diesem kurzen Abschnit will ich aber nur kurz darauf eingehen, wie man ein einzelnes Objekt, dessen Primary Key bekannt ist, aus der Datenbank auslesen kann.
Auf mehrere Objekte, und Querries werde ich in einem späteren Artikel gesondert eingehen.
Sämtlichen Schritte und nötige Anweisungen hierfür können dem Stück Code entnommen werden, genauere Erläuterungen dazu befinden sich in den jeweiligen Kommentaren.
package hibernate.tutorial; import de.blogd.tutorials.hibernate.MyObject; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; /** * Beispiel zur Deserialisierung eines Objekts aus der Datenbank * @author Stefan */ public class Deserialisierung { private static SessionFactory mySessionFactory; /** * Singleton zur Rückgabe einer aktuellen Session. * @return SessionFactgory */ public static SessionFactory getSessionFactory() { if (mySessionFactory == null) { mySessionFactory = new Configuration().configure().buildSessionFactory(); } return mySessionFactory; } /** * Erzeugt neue Session mit Hilfe der Session Factory * @return Session */ public static Session getSession() { return getSessionFactory().openSession(); } public static void main(String[] args) { /** * Auch für das deserialisieren von Objekten benötigen wir eine * Session, diesen können wir mit den, im letzten Tutorial erstellten, * Methoden bekommen. * Auch dies erleden wir wieder in einer Transaktion! */ Session myDeserialSession = getSession(); /** * Transaktion erstellen und Transaktion starten, in dieser können * die Objekte dann aus der Datenbank geholt werden. * Transaktion ist nicht zwenigend nötig, aber für ein sauberes Arbeiten * im Transaktionsbetrieb immer zu empfehlen. */ Transaction myDeserialTransaction = myDeserialSession.getTransaction(); myDeserialSession.beginTransaction(); /** * Nun holen wir das Objekt aus der Datenbank, hierzu nutzen wir einfach * die get() Methode der vorher angelegten Session, diese will 2 Parameter * 1. die zu deserialisierende Klasse, und 2. den Primärschlüssel des zu * deserialisierenden Objekts. * Als Rückgabewert erhält man ein Object, nach einem (erfolgreichen) cast * auf MyObject, kann mit diesem Objekt gearbeitet werden. */ MyObject myDeserialSampleObject = (MyObject) myDeserialSession.get(MyObject.class, 1); /** * Transaktion mit einem Commit abschließen, auch wenn keine Änderungen * gemacht wurden. */ myDeserialTransaction.commit(); /** * Nach Abschluss die Session wieder schließen. */ myDeserialSession.close(); } }
Vorlesungs Podcasts
Derzeit beschäftige ich mich (zusätzlich) noch mit Computergraphik, welche ich für mein anstehendes Praktikum (näheres dazu gibts wenn der Vertrag unterschrieben ist
), benötige. Da es von meiner Uni leider absolut keine Skripte etc. online gibt, bzw. die vorhandenen Skripte passwortgeschützt sind (und das nicht einmal mit der Studenten Kennung, sondern einer "eigenen Kennung" des Profs und ich somit ohne Besuch der entsprechenden Vorlesung sogut wie keine Chance habe an die Skripte zu kommen, TOP!) war ich mehr oder weniger dazu gezwungen mich im Internet nach anderen Vorlesungen umzusehen. Und siehe da ich wurde fündig.
Andere Unis handhaben das wohl um einiges weniger restriktiv als die HS Regensburg, da gibt es Podcasts zu den Vorlesungen, bei einer anderen Vorlesung gibt es sogar einen Podcast inkl. Video der Vorlesung und der Übungen. Ein Traum!
Hierbei sind mir im besonderen die LMU München und die Uni Osnabrück aufgefallen. Viele Vorlesungen online verfügbar, inkl. Skript und teils auch den Lösungen der Übungsaufgaben. Besser gehts nicht!
Serialisierung von Java Objekten mit Hibernate
Seit einigen Tagen plagte mich bei einem, von mir Privat getriebenen, Projekt das Problem, erzeugte Objekte in eine Datenbank zu schreiben. Zwar gibt es die Möglichkeit, hier einfach von Hand die entsprechende Engine zu schreiben, um die Attribute in die Datenbank zu schreiben, dies ist aber wie ich finde sehr aufwändig und fehleranfällig. Hibernate war mir aus diesem Kontext schon aus Java EE bekannt, womit sich dieses Framework förmlich aufgedrängt hat.
Hier will ich anhand eines kurzen Beispiel kurz demonstrieren, wie leicht eine Persistierung von Java Objekten in eine Datenbank ist, im Beispiel verwende ich MySql, eine Portierung ist aber nahezu problemlos auf andere Datenbanken wie Oracle, HSQLDB etc. möglich, hierzu müssen nur die entsprechenden Parameter in der Config Datei gesetzt werden und die entsprechenden Treiber in den Buildpath des Projekts eingebunden werden.
Die Konfiguration des MySQL Servers setze ich in dieser Einführung einfach mal vorraus, falls dies noch nicht geschehen ist, bietet sich die Installation von XAMPP an.
Der hier gezeigte Lösungsweg ist nur ein möglicher Weg, es gibt noch viele andere Varianten. Ich habe mich aber aufgrund der leichtesten Implementierung und Verständlichkeit zum
Demonstrieren dieses Weges entschlossen.
Am Anfang sollte man sich als erstes die benötigten Libaries etc. besorgen und in den Buildpath des Java Projekts einzubinden:
- Hibernate (http://www.hibernate.org/)
- dom4j (http://dom4j.sourceforge.net/)
- SLF4J (http://www.slf4j.org/)
- MySQL Connector (http://www.mysql.com/downloads/connector/j/)
Was die einzelnen Pakete nun machen, will ich an dieser Stelle nicht erklären, dass würde eindeutig zu weit führen. Falls alles richtig eingebunden ist, sollten ungefähr die folgenden
Libaries einebunden sein:
Als erstes Implementieren wir eine kurze Demoklasse, welche wir anschließend in die MySQL Datenbank serialisieren wollen.
Meine verwendete Klasse sieht in etwa so aus:
package de.blogd.tutorials.hibernate; /** * Beispiel Klasse an welcher die Serialisierung von * Objekten mittels Hibernate demonstriert wird. * @author Stefan König */ public class MyObject { /** * Zu serialisierender String */ private String aString; /** * Zu serialisierender Integer */ private int aNumber; /** * Zu serialisierendes String Array */ private String[] aStringArray; /** * Getter für aNumber * @return aNumber */ public int getaNumber() { return aNumber; } /** * Setter für aNumber * @param aNumber: Neu zu setzende aNumber */ public void setaNumber(int aNumber) { this.aNumber = aNumber; } /** * Getter für aString * @return aString */ public String getaString() { return aString; } /** * Setter für aString * @param aString */ public void setaString(String aString) { this.aString = aString; } /** * Getter für aStringArray * @return aStringArray */ public String[] getaStringArray() { return aStringArray; } /** * Setter für aStringArray * @param aStringArray */ public void setaStringArray(String[] aStringArray) { this.aStringArray = aStringArray; } }
Damit wäre der erste Schritt erledigt, und wir können uns um die Herstellung der Verbindung zur Datenbank kümmern. Hierzu legen wir im "root" Verzeichnis (also unter "./src/") eine xml
Datei mit dem Namen "hibernate.cfg.xml" an, in dieser wird Hibernate konfiguriert. Einzelne Erklärungen zu den verschiedenen Files befinden sich im Inhalt des xml Files.
< ?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> <!-- Hier werden die Zugangsdaten zur Datenbank angegeben Die Bezeichnungen sind weitestgehenden selbsterklärend --> <property name="connection.url">jdbc:mysql://localhost/HibernateSample</property> <property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.pool_size">1</property> <property name="current_session_context_class">thread</property> <!-- Gibt die SQL Querries auf der Konsole aus --> <property name="show_sql">true</property> <property name="format_sql">true</property> <!-- Mit dieser Option werden die Tabellen bei jeder Serialisierung neu angelegt, für das Tutorial bietet sich diese Lösung an, sollte aber beim produktiven Einsatz dann entfernt werden. --> <property name="hbm2ddl.auto">create</property> <!-- Es gibt mehrere Methoden zur Definition der zu serialisierenden Klassen, entweder direkt im hibernate.cfg.xml File, oder pro serialisierende Klasse ein eigenes File. Ich habe, zwecks der Übersicht zur Methode mit den einzelnen Files entschieden, diese werden mit den folgenden Befehl eingebunden. Die Namensgebung nach "Klassenname.hbm.xml" ist Konvention und sollte daher nicht verändert werden.--> <mapping resource="de/blogd/tutorials/hibernate/MyObject.hbm.xml" /> </session> </hibernate>
Da nun die Konfiguration für Hibernate, soweit fertig ist, können wir uns daran machen, dass Konfigurationsfile zur Serialisierung der Klasse zu erstellen. Dieses haben wir nach den
Konvention "MyObject.hbm.xml" genannt und befindet sich im selben Package bzw. Ordner wie die vorher erstellte Klasse MyObject.
< ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate -mapping> <!-- Hier geben wir an, welche Klasse wir in die Datenbank speichern möchten ("name") und wie die Tabelle mit den Objekten ("table") genannt werden soll. --> <class name="de.blogd.tutorials.hibernate.MyObject" table="MyObjects"> <!-- Hier legen wir den Primary Key fest --> <id column="id" type="java.lang.Integer"> <generator class="increment"/> </id> <!-- Hier werden die zu speichernden Attribute der Klasse bestimmt, Bei verschiedenen Attributen gibt es noch zusätzliche zur Verfügung stehende Attribute, auf diese möchte ich hier aber nicht weiter eingehen. name="": Name des Attributs (Groß/Kleinschreibung beachten!) type="": Hier wird die Klasse des Attributs angegeben. --> <property name="aString" type="java.lang.String"/> <property name="aNumber" type="java.lang.Integer"/> <!-- Es gibt auch die Möglichkeit Arrays in die Datenbank zu serialisieren, hierfür kann man sich an den folgenden Zeilen orientieren. --> <array name="aStringArray"> <key column="id" /> <list -index base="0" /> <element column="role" type="java.lang.String" /> </array> </class> </hibernate>
Nun haben wir an Konfigurationsdateien alles notwendige erstellt und können uns dem Speichervorgang in die Datenbank selbst widmen.
package hibernatetutorial; import de.blogd.tutorials.hibernate.MyObject; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; /** * In dieser Klasse wird die Serialisierung * mittels entsprechender Methoden erledigt. * @author Stefan */ public class Main { private static SessionFactory mySessionFactory; /** * Singleton zur Rückgabe einer aktuellen Session. * @return SessionFactgory */ public static SessionFactory getSessionFactory(){ if(mySessionFactory == null) mySessionFactory = new Configuration().configure().buildSessionFactory(); return mySessionFactory; } /** * Erzeugt neue Session mit Hilfe der Session Factory * @return Session */ public static Session getSession(){ return getSessionFactory().openSession(); } public static void main(String[] args){ /** * Das zu serialisierende Objekt anlegen. */ MyObject sampleObject = new MyObject(); sampleObject.setaNumber(43); sampleObject.setaString("Ich bin ein String"); String[] sampleStringArray = {"Hallo","ich","bin","ein","String","Array"}; sampleObject.setaStringArray(sampleStringArray); /** * Session zur Serialisierung anlegen. */ Session mySession = getSession(); /** * Transaktion beginnen */ Transaction myTransaction = mySession.beginTransaction(); /** * Objekte in Datenbank schreiben. */ mySession.save(sampleObject); /** * Transaktion abschließen */ myTransaction.commit(); } }
Falls dies nun fehlerfrei durchgelaufen ist, sollte der Eintrag in die Datenbank erfolgreich vorgenommen worden sein. Für das Deserialisieren der Files, werde in in den nächsten Tagen einen extra Artikel zur Verfügung stellen.
Download der Source Files (inkl. xml Files): Hibernate Tutorial Files
Verschwörung?
Langsam bin ich davon überzeugt, dass Wetterfrösche eine Verschwörung gegen mich in Gang gesetzt haben, in der Woche lief es immer nach dem gleichen Schema ab:
Ich sitze in der Uni == das Wetter ist schön
Ich verlasse die Uni == keine Sonne mehr, oder es regnet.
Heute ist es auch nicht anders, Vormittags hab ich gelernt, Nachmittags wollte ich laufen gehen. Denkste.
