Hibernate: table / character encoding beeinflussen

MySQL in Version 5 will gern und viel seine Tabellen mit dem characterEncoding latin1_swedish_ci anlegen. Das führt jedoch bei Strings mit Sonderzeichen (zum Beispiel Buchstaben aus dem griechischen Alphabet) zu einigen Problemem. Ein generelles Encoding auf utf8 löst die meisten.

Leider kann Hibernate von Haus aus dieses Encoding nicht einstellen. Verschiedene Testes führen nicht zum Erfolg:

Versuch 1: der Entity-Annotation einen Parameter mitgeben. Leider gibt es hier aber keinen Paramter der diese Einstellung verwalten kann. Auch ein alter table nach dem @Entity via @SQLUpdate(sql=“ALTER TABLE …. CHARACTER SET utf8 COLLATE utf8_general_ci;“) führt nicht zum Erfolg.

Versuch 2: in der Konfiguration hibernate.cfg.xml die Connection URL anpassen:

<property name=“connection.url“> jdbc:mysql://server/database?useUnicode=true&characterEncoding=UTF8 </property>

… doch in bezug auf das Anlegen der Tabellen zeigt dies keine Wirkung.

Versuch 3: Einen eigenen SQL Dialekt schreiben! das geht bei Hibernate denkbar einfach, da man die bestehenden Dialekte überschreiben kann.

import org.hibernate.dialect.MySQLMyISAMDialect;
/**
* MySQL Dialect for using utf8 table types
*/
public class MysqlDialectUtf8 extends MySQLMyISAMDialect {
public String getTableTypeString() {
return “ ENGINE=MyISAM DEFAULT CHARSET=utf8″;
}
}

In der hibernate.cfg.xml wird nun einfach auf den eigenen Dialect verwiesen:

<property name=“dialect“>
de.my-container.project.hibernate.dialect.MysqlDialectUtf8
</property>

et voila. Die Tabellen werden nun mit dem characterEncoding UTF 8 angelegt, womit Sonderzeichen keine Probleme mehr machen!