Schaut euch mal die Klasse org.hibernate.type.DateType an. Hibernate benutzt diese Klasse wenn im Mapping "type=date" steht. Hier liegt die Ursache meines Problems:
...
public Object get(ResultSet rs, String name) throws SQLException {
return rs.getDate(name);
}
...
Es wird einfach das Datum für die benannte Spalte zurückgegeben, und zwar als java.sql.Date!!!
Hier die Lösung:
1) Neue Klasse schreiben, die das Interface org.hibernate.usertype.UserType implementiert
2) Etliche Methoden müssen implementiert werden, hier die 2 wichtigsten: "nullSafeSet" und "nullSaveGet". "nullSaveSet" bekommt als Parameter ein PreparedStatement und ein Objekt, dass in die DB geschrieben werden soll. Das Objekt wird in meinem Fall einfach gecastet und anschließend setze ich alle Objektattribute für das PreparedStatement. Ich setze hier einfach eine Timestamp, die ich mir aus dem Date-Übergabeparameter herleite. "nullSaveGet" funktioniert genau umgekehrt; diese Methode dient zum Auslesen der Datensätze und zum Erzeugen entsprechender Entity-Klassen. Als Übergabeparameter gibt's hierbei ein Resultset und ein Array mit allen Spaltennamen. Jetzt kann ich aus meinem ResultSet die passende Date-Komponente als Timestamp extrahieren, daraus ein java.util.Date bauen und es anschließend zurückgeben.
3) Im Hibernate-Mapping File muss der entsprechende Eintrag "type=KlasseDieDasUserTypeInterfaceImplementiert" gemacht werden
... vielleicht klingt das alles viel zu kompliziert, vielleicht gibt es ja auch bessere Lösungsansätze... Egal, es funktioniert jetzt jedenfalls ;-)
|