-->
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.  [ 3 posts ] 
Author Message
 Post subject: org.hibernate.collection.PersistentSet
PostPosted: Mon Apr 07, 2008 5:36 am 
Newbie

Joined: Thu Mar 27, 2008 8:44 am
Posts: 8
Bonjour à tous,

Je rencontre un souci avec mon appli. Je développe avec Hibernate 3 et Spring.

J'ai trois tables : USER, SITE et USER_SITE.
Mon mapping est le suivant :

USER
Code:
<hibernate-mapping>
    <class name="User" table="users">
   
    <id name="id" type="integer">
       <generator class="increment"/>       
    </id>

    <property name="name">
        <column name="name"/>
    </property>

    <set name="userSites" inverse="true" cascade="all-delete-orphan">
       <key column="user"/>
       <one-to-many class="UserSite"/>
    </set>
   
</class>
</hibernate-mapping>


USER_SITE
Code:
<hibernate-mapping>
    <class name="com.schneider.wum.dao.vo.WebVisitorSite" table="web_visitor_site">
   
    <id name="id" type="int">
      <generator class="increment"/>       
    </id>
   
    <property name="validated">
        <column name="validated"/>
    </property>
   
   <many-to-one name="site" class="Site">
     <column name="site" sql-type="number"/>
   </many-to-one>
   
   <many-to-one name="user" class="User">
     <column name="user"/>
   </many-to-one>
   
</class>
</hibernate-mapping>


SITE
Code:
<hibernate-mapping>
    <class name="com.schneider.wum.dao.vo.Site" table="sites">
   
    <id name="id" type="integer">
       <generator class="increment"/>       
    </id>
   
    <property name="name">
        <column name="name"/>
    </property>
   
    <set name="siteUsers" inverse="true" cascade="all-delete-orphan">
       <key column="site"/>
       <one-to-many class="UserSite"/>
    </set>
           
</class>
</hibernate-mapping>


Je dois faire une recherche d'utilisateur par site et/ou par nom.
J'ai donc une méthode qui fait la recherche :

SearchUser
Code:
   public List searchUser(Integer site, String name) {

      List results = null; 
      Session session = getHibernateTemplate().getSessionFactory().openSession();
        try {

           Criteria criteria = session.createCriteria(User.class);
           if (site != null){
              criteria.createCriteria("userSites").createCriteria("site").add(Restrictions.eq("id", site));
           }
           if(name != null){
              criteria.createCriteria("name").add(Restrictions.eq("name",name));
           }
         
           results= criteria.list();    
          
           Iterator iterator = results.iterator();
           while (iterator.hasNext()){
              User user = (User) iterator.next();
              Hibernate.initialize(user.getUserSites());
              Set userSites = user.getUserSites();
              Iterator iteratorSites = userSites.iterator();
              while (iteratorSites.hasNext()){
                 UserSite userSite = (UserSite) iteratorSites.next();
                 Hibernate.initialize(userSite.getSite());
              }
           }
        }
        catch( Exception e ) {
           log.error("searchUser: ", e);
        }
        finally{
           session.close();
        }
      return results;


Dans mon controleur, je fait ça :

Code:
   public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception  {

      
      SearchForm searchForm = (SearchForm) command;
      
      String site = searchForm.getSite();
      String name = searchForm.getName();
      
      // Création d'un modèle
      Map model = errors.getModel();
      // Récupération de la liste des users correspondant aux critères de recherches
      List list = userService.searchUser(site, name);
      
      Iterator iterator = list.iterator();
      List listUserSite = new ArrayList();
      while (iterator.hasNext()){
         User user = (User) iterator.next();
         if(user.getUserSites()!= null)            listUserSite.add(user.getUserSites());
      }
      // Tri de la liste
      Collections.sort(list, new LabelComparator());
      
      // Ajout de la liste des users au modèle avec la clé "users"      
      model.put("users", list);
      // Ajout de la liste des users par site au modèle avec la clé "userSites"   
      model.put("userSites", listUserSite);
      
      // Retour vers la page search.htm dans laquelle on charge le modèle créé
      return showForm(request, response, errors, model);
   }


Une fois dans ma page, je veux donc afficher mes résultats et je fais ça :
Code:
         <c:forEach var="user" items="${users}">   
            <c:forEach var="userSite" items="${userSites}">
                  <tr>
                     <td align="center"><c:out value="${userSite.site.name}"/></td>
                     <td align="center"><c:out value="${user.name}"/></td>
                     

                  </tr>
            </c:forEach>
         </c:forEach>


Bon et là, rien ne va plus :)
J'ai cette erreur :
Code:
javax.servlet.ServletException: Unable to find a value for "site" in object of class "org.hibernate.collection.PersistentSet" using operator "."


Alors je comprends pourquoi, j'ai cette erreur (je veux récupérer un site sur un objet qui n'est pas un UserSite mais un Set, d'où l'erreur).

La seule chose que je ne sais pas, c'est comment résoudre cette erreur et comment améliorer ma recherche parce que je trouve que ce n'est pas très performant.

Si quelqu'un avait déjà eu à faire ce genre de choses et pouvait me donner quelques conseils, ça serait très gentil :)

Merci de m'avoir lu jusque là en tout cas :)

Audrey.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Apr 08, 2008 2:33 am 
Beginner
Beginner

Joined: Thu Jan 31, 2008 6:35 am
Posts: 27
Salut,

J'ai du mal à comprendre ton erreur, elle arrive quand exactement ?

Sinon il y a peut-etre une erreur sur la ligne :
Code:
criteria.createCriteria("name").add(Restrictions.eq("name",name));

Je pense plus à :
Code:
criteria.add(Restrictions.eq("name",name));


Sinon pour les perfs, tu peux activer le cache. Attention de bien le mettre aussi sur les associations :

Code:
<!-- EhCache -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_structured_cache">true</property>

<class-cache usage="read-write" class="User"/>
<collection-cache usage="read-write" collection="User.userSites"/>
<class-cache usage="read-write" class="UserSite"/>
<collection-cache usage="read-write" collection="UserSite.site"/>
<collection-cache usage="read-write" collection="UserSite.user"/>
<class-cache usage="read-write" class="Site"/>
<collection-cache usage="read-write" collection="Site.siteUsers"/>


Samuel


Top
 Profile  
 
 Post subject:
PostPosted: Tue Apr 08, 2008 4:07 am 
Newbie

Joined: Thu Mar 27, 2008 8:44 am
Posts: 8
Bonjour,

Merci de m'avoir répondu Sliard.
J'ai trouvé la solution à mon problème hier. Effectivement, tu avais raions pour la ligne
Code:
criteria.createCriteria("name").add(Restrictions.eq("name",name));


Je l'avais corrigée.

Par contre, j'ai également modifiée mon controleur qui est devenu ceci :
Code:
   public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception  {

      
      SearchForm searchForm = (SearchForm) command;
      
      String site = searchForm.getSite();
      String name= searchForm.getName();
      
      // Création d'un modèle
      Map model = errors.getModel();
      List list = userService.searchUser(site, name);
         
      // Tri de la liste
      Collections.sort(list, new LabelComparator());
         
      model.put("users", list);
      
      // Retour vers la page search.htm dans laquelle on charge le modèle créé
      return showForm(request, response, errors, model);
   }
   

}


Dans ma jsp, j'ai maintenant le code suivant :
Code:
               <c:forEach var="user" items="${users}">   
                  <c:forEach var="userSite" items="${user.userSites}">
                        <tr>
                           <td align="center"><c:out value="${userSite.site.name}"/></td>
                           <td align="center"><c:out value="${user.name}"/></td>
                        </tr>
                  </c:forEach>
               </c:forEach>


Et tout fonctionne maintenant.

Merci à tout ceux qui ont lu mon post.

Audrey


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 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.