Ich mache gerade meine ersten Schritte mit Hibernate, und bin an ein (Anfänger)Problem gestossen, bei dem ich auch nach intensivem googlen eine Lösung gefunden habe.
Die Objekte in diesem Beispiel sind:
- User
- Role
wobei ein 'User' eine 'Role' haben soll.
Die Hibernate Mappings sehen wie folgt aus:
[User.hbm.xml]
Code:
<hibernate-mapping>
<class name="idx.forum.bean.User" table="users">
<id name="id" type="integer" column="id" unsaved-value="null">
<generator class="hilo"/>
</id>
<property name="login" type="string" column="login" unique="true"
not-null="true" length="16" />
<property name="password" type="string" column="pwd" not-null="true"
length="16" />
<many-to-one name="role" class="idx.forum.bean.Role" column="role"
not-null="true" />
</class>
</hibernate-mapping>
[Role.hbm.xml]
Code:
<hibernate-mapping>
<class name="idx.forum.bean.Role" table="roles">
<id name="id" type="integer" column="id" unsaved-value="null">
<generator class="hilo"/>
</id>
<property name="name" type="string" column="name" unique="true"
not-null="true" length="16" />
</class>
</hibernate-mapping>
Ich hab nun mit Hibernate eine 'Role' angelegt, einen 'User' angelegt und diesem die role zugewisen. Das klappt ganz wunderbar, und in der DB sieht's auch richtig aus:
Code:
Tabelle 'users':
oid=35510
id=32768
login=pwalser
pwd=abcde
first_name=Peter
last_name=Walser
role=1
Tabelle 'roles':
oid=35506
id=1
name=Developer
Nun versuche ich, mit Hibernate den User und seine Role aus der DB auszulesen:
(Anmerkung: das User und Role POJO haben je eine toString() methode, die die properties ausgibt)
Code:
SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
Session session=session=sessionFactory.openSession();
Transaction tx=session.beginTransaction();
Criteria criteria = session.createCriteria(User.class);
Iterator users=criteria.list().iterator();
while (users.hasNext())
{
User user=(User)users.next();
System.out.println(user.getLogin()+" is a "+user.getRole().getName());
System.out.println(user.getRole());
}
tx.commit();
session.flush();
session.close();
Ausgabe:
Code:
pwalser is a null
Role [id=1, name=Developer ]
Der User wurde korrekt gelesen, seine Role ist ebenfalls vorhanden, aber die Role ist nicht von der Datenbank geladen geworden (role.getId() und role.getName() sind beide null).
Merkwürdigerweise funktioniert die toString() methode korrekt, obwohl die beiden Properties lokal null sind.
Alle Hinweise, die ich bis jetzt gefunden habe, deuten drauf hin, dass man die Role von Hibernate inizialisieren lassen soll, um so deren Properties zu polulieren (mittels Hibernate.initialize(role)). Leider löst sich mein Problem dadurch nicht:
Code:
while (users.hasNext())
{
User user=(User)users.next();
System.out.println("Initialized: "+Hibernate.isInitialized(user.getRole()));
Hibernate.initialize(user.getRole());
System.out.println("Initialized: "+Hibernate.isInitialized(user.getRole()));
System.out.println(user.getLogin()+" is a "+user.getRole().getName());
System.out.println(user.getRole());
}
Führt zur Ausgabe:
Code:
Initialized: false
Initialized: true
pwalser is a null
Role [id=1, name=Developer ]
Nachtrag: wenn ich die Role und den User anlegen und in der gleichen(!) Session wieder Ausgebe (mit dem Code oben), erhalte ich ein korrektes Resultat ("pwalser is a Developer"). Das ist aber nicht der Sinn der Sache :-/
Ich stehe atm. wie eine Kuh am Berg. Kann mit jemand weiterhelfen und mir sagen, wo der Fehler liegt?
Danke im Voraus,
Peter Walser