-->
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.  [ 1 post ] 
Author Message
 Post subject: Requête sur table d'association -> collection vide
PostPosted: Sat Feb 20, 2010 10:32 pm 
Newbie

Joined: Sat Feb 20, 2010 10:02 pm
Posts: 1
Bonjour,
J'ai une relation many-to-many dans ma base de donnée avec une table croisée.
Je voudrais récupérer la liste des organisations pour une ressource.

ressource--------------*ressource_organisation*-------------organisation


Ça fonctionnait jusqu'à ce que je veuille récupérer une valeur de la table croisée et que je modifie mon mapping en y incluant un <composite-element> comme je l'ai lu dans la doc.
Ma collection de "RessourceOrganisation" et vide bien qu'elle ait été créée par hibernate puisque je récupère sa taille !

Je vous montre ici mon code

Ressource.hbm.xml

Code:
<hibernate-mapping package="eventyou.model">
   <class name="eventyou.model.Ressource" table="ressource" discriminator-value="R" lazy="false" >
   
   <id name="idRessource" column="ressource_id">
      <generator class="native" />
    </id>
   
   <discriminator column="dtype" />
   
   <property name="nom" column="nom" />
   <property name="enabled" column="enabled" />
   
   
   <set name="roles" table="ressource_role" lazy="false">
      <!-- <cache usage="read-write" /> -->
      <key column="ressource_id" />
      <many-to-many column="role_id" class="eventyou.model.Role" />
   </set>
   <list name="ressourceOrganisations" table="ressource_organisation" lazy="false" cascade="all" fetch="join">
      <key column="ressource_id" />
      <list-index column="ressource_organisation_id" />
      <composite-element class="eventyou.model.RessourceOrganisation">
         <property name="roleorg" column="roleorg" />
         <many-to-one name="organisation" column="organisation_id" class="eventyou.model.Organisation" />
      </composite-element>
   </list>[/color]
   
   <subclass name="Humain" discriminator-value="H">
      <property name="prenom" column="prenom" />
      <property name="email" column="email" />
      <property name="password" column="password" />
   </subclass>
   <subclass name="Materiel" discriminator-value="M">
      <property name="type" column="type" />
   </subclass>
   
   </class>
</hibernate-mapping>


Ressource.java

Code:
public class Ressource implements Serializable, Comparable<Object> {
   
   private Integer idRessource;
   private String dtype;
   private String nom;
   private boolean enabled;
   private Set<Role> roles = new HashSet<Role>();
   private List<RessourceOrganisation> ressourceOrganisations = new ArrayList<RessourceOrganisation>();
   
   public void setIdRessource(Integer idRessource) {
      this.idRessource = idRessource;
   }

   public Integer getIdRessource() {
      return idRessource;
   }

   public void setDtype(String dtype) {
      this.dtype = dtype;
   }

   public String getDtype() {
      return dtype;
   }

   public void setNom(String nom) {
      this.nom = nom;
   }

   public String getNom() {
      return nom;
   }

   public void setEnabled(boolean enabled) {
      this.enabled = enabled;
   }

   public boolean isEnabled() {
      return enabled;
   }

   public void setRoles(Set<Role> roles) {
      this.roles = roles;
   }

   public Set<Role> getRoles() {
      return roles;
   }

   public void setRessourceOrganisations(List<RessourceOrganisation> ressourceOrganisations) {
      this.ressourceOrganisations = ressourceOrganisations;
   }

   public List<RessourceOrganisation> getRessourceOrganisations() {
      return ressourceOrganisations;
   }

   public int compareTo(Object arg0) {
      Ressource in = (Ressource) arg0;
      return this.getNom().compareTo(in.getNom());
   }
   
   public boolean equals(Object o){
      if(this == o){
         return true;
      }
      if(!(o instanceof Ressource)){
         return false;
      }
      final Ressource ressource = (Ressource) o;
      
      if(!(nom.equals(ressource.getNom()))){
         return false;
      }
      return true;
   }
   
   public int hashCode(){
      return nom.hashCode();
   }


RessourceOrganisation.java

Quote:
public class RessourceOrganisation implements Serializable {

private Integer idRessourceOrganisation;
private Integer ressourceId;
private Integer organisationId;
private String roleorg;
private Organisation organisation;

public void setIdRessourceOrganisation(Integer idRessourceOrganisation) {
this.idRessourceOrganisation = idRessourceOrganisation;
}
public Integer getIdRessourceOrganisation() {
return idRessourceOrganisation;
}
public void setRessourceId(Integer ressourceId) {
this.ressourceId = ressourceId;
}
public Integer getRessourceId() {
return ressourceId;
}

public void setOrganisationId(Integer organisationId) {
this.organisationId = organisationId;
}
public Integer getOrganisationId() {
return organisationId;
}

public void setRoleorg(String roleorg) {
this.roleorg = roleorg;
}
public String getRoleorg() {
return roleorg;
}

public void setOrganisation(Organisation organisation) {
this.organisation = organisation;
}
public Organisation getOrganisation() {
return organisation;
}
}


Ma requête qui pose problème...
Code:
(...)
      Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
      
      Query q = session.createQuery("from Humain h where h.email = :email");
      q.setString("email", email);
      Humain h = (Humain) q.uniqueResult();
      System.out.println(h.getPrenom());
      System.out.println(h.getRessourceOrganisations().size());
      Hibernate.initialize(h.getRessourceOrganisations());
      List<RessourceOrganisation> ros = h.getRessourceOrganisations();
      Iterator<RessourceOrganisation> i = ros.iterator();
      if(i.hasNext()){
         
         RessourceOrganisation ro = (RessourceOrganisation)i.next();
         
         [color=#FF0000]//System.out.println(ro.getRoleorg()); //C'est ici que ça coince[/color]
      }
(...)


Ceci m'affiche donc bien le prénom ainsi que la taille de la collection sur ma classe d'association..., mais ce nombre est inexacte ET la collection est vide !!!
Par exemple, la ressource humaine "Marie" est normalement associée à 3 organisations dans la base de donnée, hors la taille de la collection est de 4.
De plus, celle-ci et vide.

Voici les requêtes d'Hibernate qui me semblent correctes :
Code:
Hibernate:
SELECT humain0_.ressource_id as ressource1_0_, humain0_.nom as nom0_, humain0_.enabled as enabled0_, humain0_.prenom as prenom0_, humain0_.email as email0_, humain0_.password as password0_
FROM ressource humain0_
WHERE humain0_.dtype='H'
AND humain0_.email=?

Hibernate:
SELECT ressourceo0_.ressource_id as ressource1_1_, ressourceo0_.roleorg as roleorg1_, ressourceo0_.organisation_id as organisa3_1_, ressourceo0_.ressource_organisation_id as ressource4_1_, organisati1_.organisation_id as organisa1_4_0_, organisati1_.nom as nom4_0_
FROM ressource_organisation ressourceo0_
LEFT OUTER JOIN organisation organisati1_
ON ressourceo0_.organisation_id=organisati1_.organisation_id
WHERE ressourceo0_.ressource_id=?

Hibernate:
SELECT roles0_.ressource_id as ressource1_1_, roles0_.role_id as role2_1_, role1_.role_id as role1_3_0_
FROM ressource_role roles0_ left outer join role role1_
ON roles0_.role_id=role1_.role_id
WHERE roles0_.ressource_id=?


Et lorsque je décommente la ligne qui pose problème ci-dessus, j'obtiens le message suivant qui me dit qu'effectivement y a pas d'objet dans ma collection

Quelqu'un peut-il m'aider ? ce serait vraiment sympa.

exception
javax.servlet.ServletException: java.lang.NullPointerException
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
cause mère
java.lang.NullPointerException
eventyou.dao.RessourceDAOImpl.authenticate(RessourceDAOImpl.java:93)
eventyou.service.RessourceManagerImpl.authenticate(RessourceManagerImpl.java:15)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
$Proxy1.authenticate(Unknown Source)
eventyou.web.ShowOrganisationsAction.execute(ShowOrganisationsAction.java:47)
org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


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

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.