Hallo,
ich arbeite mit Hibernate 3.0 und MySQL 4.1.
MySQL arbeitet in Character Felder case-insensitiv. Über eine one-to-many Beziehung bin ich auf folgendes Problem gestoßen:
Eine einfache Klasse ohne Mapping und SQL:
Code:
public Example {
private String pk;
public String getPk() {
return pk;
}
public void setPk(String pk) {
this.pk = pk;
}
}
Folgender Code
Code:
Example example = (Example) session.get(Example.class, "abc");
initialisert das Object mit pk='abc' und dies unabhängig davon, ob der Datensatz in der Datenbank mit 'ABC' oder 'abc' gespeichert ist. Gleichermaßen erzeugt
Code:
Example example = (Example) session.get(Example.class, "ABC");
bei unveränderter Datenbasis ein Object mit pk='ABC'.
Ein Code mit Query
Code:
Query query = session.createQuery("FROM Example WHERE pk=:pk");
query.setString("pk", "ABC");
List list = query.list();
...
liefert hingegen das erwartete Ergbebnis, d.h. pk bildet exakt (case-sensitiv) den Wert aus der Datenbank ab.
Was in diesem einfachen Fall unbedeutend erscheint, wirkt sich bei einer Datenstruktur mit Beziehung (getestet mit many-to-one, gemappt mit set-Element) fatal aus. Session#get(Class clazz, Serializable id) liefert nur dann ein korrekt initialisiertes Object, inklusive der Objekte aus der Beziehung, wenn id exakt dem in der Datenbank gespeicherten PK entspricht (case-sensitiv). Das heißt die Child-Objekte werden case-sensitiv gesucht und initialisiert (bzw. eben nicht).
Die Query-Anweisung liefert das Object hingegen korrekt initialisiert, d.h. sucht und findet alle Objekte case-insensitiv, initialisiert sie korrekterweise aber case-sensitiv.
Gibt es eine Konfigurationmöglichkeit, evt. beim Mapping, welche das Verhalten der Session#get(Class clazz, Serializable id) Methode ändert.
Dank und Gruß
Kuno