-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 
Author Message
 Post subject: Probleme mit Lazy Initialization
PostPosted: Wed Nov 23, 2005 11:31 am 
Newbie

Joined: Wed Nov 23, 2005 11:27 am
Posts: 7
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


Top
 Profile  
 
 Post subject:
PostPosted: Thu Nov 24, 2005 8:54 am 
Senior
Senior

Joined: Mon Aug 22, 2005 5:45 am
Posts: 146
bitte poste deine hibernate config


Top
 Profile  
 
 Post subject:
PostPosted: Thu Nov 24, 2005 9:48 am 
Newbie

Joined: Wed Nov 23, 2005 11:27 am
Posts: 7
axismundi wrote:
bitte poste deine hibernate config


Meine config sieht wie folgt aus (ich verwende Hibernate 3.0.5):

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration
    PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

   <!-- Generated by idxCodegen -->

   <session-factory>

   <property name="connection.driver_class">org.postgresql.Driver</property>
   <property name="connection.url">jdbc:postgresql://localhost:5432/idxblog_db</property>
   <property name="connection.username">idxblog_user</property>
   <property name="connection.password">???????</property>
   <property name="show_sql">true</property>
   <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
 
   <mapping resource="idx/forum/bean/User.hbm.xml"/>
   <mapping resource="idx/forum/bean/Role.hbm.xml"/>

   </session-factory>
   
</hibernate-configuration>


Top
 Profile  
 
 Post subject:
PostPosted: Fri Dec 02, 2005 9:32 am 
Beginner
Beginner

Joined: Fri Jul 16, 2004 3:21 am
Posts: 40
Dein Mapping User Mapping stimmt nicht:

also ein User kann N Rollen haben?

Code:
<set name="roles " inverse="true">
            <key>
                <column name="<rollen primary key>" />
            </key>
     <one-to-many name="role" class="idx.forum.bean.Role" column="role"
         not-null="true" />
        </set>


Versuche es so mal.

gruss pfenn


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.