Tag: DB

Java Tutorial: Hibernate, MySQL, Annotations

Heute Morgen das Beispiel mit XML veröffentlicht, folgt jetzt das gleiche Beispiel mit Annotations. Diese sind erst seit Java 5 verfügbar und bieten den Vorteil man muss nicht immer zwei Dateien anpassen. Mit Annotations ist es möglich direkt im Java Code festzulegen wie das Objekt später in der Datenbank abgelegt wird.

Bereits in der Übersicht kann man sehen, das die Konfigurationsdatei für das Objekt wegfällt. Die Konfiguration die vorher in der der XML Datei vorgenommen wurde wird jetzt direkt in die Java Klasse implementiert. Natürlich entfällt dann auch die Angabe über die Konfigurationsdatei in der Hibernate Konfiguration.
Aber genug Geschwätz sehen wir uns das Objekt an:

[java]
// File: Tisch.java

package obj;

import java.io.Serializable;
import java.text.MessageFormat;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;

@Entity
public class Tisch implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@SequenceGenerator(name = “tisch_gen”, sequenceName = “tisch_id_seq”)
private Integer id;
private Integer Fuesse;
private String Material;

public Tisch(){ }

private Integer getId() {
return id;
}

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

public Integer getFuesse() {
return Fuesse;
}

public void setFuesse(Integer fuesse) {
Fuesse = fuesse;
}

public String getMaterial() {
return Material;
}

public void setMaterial(String material) {
this.Material = material;
}

public String toString() {
return MessageFormat.format(“{0}: Fuesse={1}, Material={2}”, new Object[] {
getClass().getSimpleName(), Fuesse, Material });
}
}
[/java]

Wie oben bereits oft erwähnt entfällt die Konfigurationsdatei. Also kommen wir gleich zu der Session.

[java]
// File: SingSessionFactory.java

package hibe;

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

public class SingSessionFactory {

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

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

static {
final AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.configure(“/hibernate.cfg.xml”);
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getInstance() {
return sessionFactory;
}

}
[/java]

Die Main Klasse

[java]
// File: HibeMySQL.java

package exa;

import hibe.SingSessionFactory;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;

import obj.Tisch;

public class HibeMySQL {

private static Logger log = Logger.getLogger(HibeMySQL.class);

public static void main(String[] args) {
Tisch wohnzimmer = new Tisch();
wohnzimmer.setMaterial(“Eiche”);
wohnzimmer.setFuesse(3);

Session ses = SingSessionFactory.getInstance().getCurrentSession();
Transaction tx = ses.beginTransaction();

ses.save(wohnzimmer);

tx.commit();
}
}
[/java]

Die angepasste Konfiguration von Hibernate

[xml]



jdbc:mysql://localhost:3306/bank root com.mysql.jdbc.Driver org.hibernate.dialect.MySQLDialect org.hibernate.transaction.JDBCTransactionFactory thread true

true update


[/xml]

Zur Vollständigkeit noch die Konfigurationsdatei von Log4J.

[xml]
# File: log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L – %m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L – %m%n

### set log levels – for more verbose logging change ‘info’ to ‘debug’ ###

log4j.rootLogger=debug, stdout

log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=info

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
log4j.logger.org.hibernate.cache=info

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
[/xml]

Java Tutorial: Hibernate, MySQL, XML

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]
// File: Tisch.java

package obj;

import java.io.Serializable;
import java.text.MessageFormat;

public class Tisch implements Serializable{

private static final long serialVersionUID = 1L;

private Integer id;
private Integer Fuesse;
private String Material;
private Tisch tisch;

public Tisch(){}

private Integer getId() {return id;}

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

public Integer getFuesse() {return Fuesse;}

public void setFuesse(Integer fuesse) {Fuesse = fuesse;}

public String getMaterial() {return Material;}

public void setMaterial(String material) {this.Material = material;}

private Tisch getTisch() {return tisch;}

private void setTisch(Tisch tisch) {this.tisch = tisch;}

public String toString() {
return MessageFormat.format(“{0}: Fuesse={1}, Material={2}”, new Object[] {
getClass().getSimpleName(), Fuesse, Material });
}
}
[/java]

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]









[/xml]

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

[java]
// File: SingSessionFactory.java

package hibe;

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

public class SingSessionFactory {

private static org.hibernate.SessionFactory sessionFactory;

private SingSessionFactory() {}
static {

final Configuration cfg = new Configuration();
cfg.configure(“/hibernate.cfg.xml”);
cfg.buildSessionFactory();
sessionFactory = cfg.buildSessionFactory();
}

public static SessionFactory getInstance() {
return sessionFactory;
}
}
[/java]

Anschließend können wir unsere Main implementieren.

[java]
// File: HibeMySQL.java

package exa;

import hibe.SingSessionFactory;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;

import obj.Tisch;

public class HibeMySQL {

private static Logger log = Logger.getLogger(HibeMySQL.class);

public static void main(String[] args) {
Tisch wohnzimmer = new Tisch();
wohnzimmer.setMaterial(“Eiche”);
wohnzimmer.setFuesse(3);

Session ses = SingSessionFactory.getInstance().getCurrentSession();
Transaction tx = ses.beginTransaction();

ses.save(wohnzimmer);

tx.commit();
}
}
[/java]

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

[xml]




jdbc:mysql://localhost:3306/bank root com.mysql.jdbc.Driver org.hibernate.dialect.MySQLDialect org.hibernate.transaction.JDBCTransactionFactory thread true

true update

[/xml]

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

[xml]
# File: log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L – %m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L – %m%n

### set log levels – for more verbose logging change ‘info’ to ‘debug’ ###

log4j.rootLogger=debug, stdout

log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=info

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
log4j.logger.org.hibernate.cache=info

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
[/xml]

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

Java & MySQL

Dieses Beispiel ist einfach mal zum Testen gedacht. Die MySQL Datenbank wurde einfach aus einem XAMPP Paket heraus verwendet. Das diese richtige funktioniert wurde bereits mehrfach mit PHP getestet. Für PHP gibt es auch entsprechende Testskripte auf http://www.php.net, für Java habe ich etwas ähnliches gesucht, aber nicht gefunden. Deshalb habe ich einfach mal schnell selber eine Beispielimplementierung vorgenommen.

Bevor man loslegt braucht man unbedingt den JDBC Treiber von MySQL. Diesen sollte man mittels Google schnell finden und herunterladen können. In dem Paket ist ein Jar-File enthalten, welches als External Jar in das folgende Java Projekt eingebunden werden muss.

Die MySQL Datenbank kann einfach über XAMPP Control gestartet werden und das folgende Skript sollte den Inhalt entsprechend anzeigen. Die TODO müssen entsprechend angepasst werden.

[java]
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class HelloMySql {

/**
* @param args
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void main(String[] args) throws ClassNotFoundException,
SQLException {

// JDBC MySQL Treiber einbinden
Class.forName(“com.mysql.jdbc.Driver”);

// TODO datenbank anpassen
String url = “jdbc:mysql://localhost:3306/datenbank”;

java.sql.Connection con =
DriverManager.getConnection(
url,”root”, “”);

System.out.println(“URL: ” + url);
System.out.println(“Connection: ” + con);

Statement stmt = con.createStatement();

// TODO tabelle anpassen
ResultSet rs = stmt.executeQuery(“SELECT * FROM tabelle”);

System.out.println(“Display all results:”);

while(rs.next()){
// TODO spalte anpassen
String str = rs.getString(“spalte”);
System.out.println(str);
}
}
}
[/java]

The Reference Index table is empty which is likely to be the case because you just upgraded your TYPO3 source.

Diese Meldung erscheint beim einloggen nach einer Neuinstallation bzw. nach einem Update. Obwohl in der Meldung auch schon beschrieben wird was ich machen soll Please go to Tools>DB Check and update the reference index. ist es mir schon oft passiert, dass wenn ich unter DB check auf Update now! geklickt habe, die Meldung immer noch erschien, beim einloggen bzw. wenn ich F5 gedrückt habe. Die einzige Möglichkeit die ich bisher dagegen gefunden habe ist, die ganze Datenbank zu leeren, also alle Tabellen zu löschen und im 1 2 3 Mode von Typo3 nochmals auf Import Database zu gehen. Denn in der normalen Ansicht, habe ich nach dem Import der Databank wieder vor dem gleichen Problem gestanden. Um die Typo3 Installation wieder in den 1 2 3 Mode zu versetzen muß man in der typo3conf/localconf.php alles entfernen was unter ## INSTALL SCRIPT EDIT POINT TOKEN – all lines after this points may be changed by the install script! steht. Anschließend sollte man das Passwort wieder auf den MD5 Wert von joh316 ändern bacb98acf97e0b6112b1d1b650b84971 . Wenn man jetzt domain.de aufruft sollte man wieder im 1 2 3 Mode vom Installtool sein. Hier klicken wir dann nachdem wir unsere Datenbankverbindung eingetragen haben und sie in die localconf.php geschrieben wurde auf Import Database . Nachdem die Installation fertig ist sollten wir nun im Backend unsere Tabelle indizieren können.

[random_content group_id=”211″ num_posts=”1″]