-->
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: Simplification de requêtes
PostPosted: Tue Aug 02, 2005 11:11 am 
Newbie

Joined: Tue Aug 02, 2005 10:50 am
Posts: 6
Bonjour à tous,

J'ai commencé à utiliser Hibernate depuis quelques jours et je suis confronté à un problème relativement génant :

J'ai une classe prospect qui contient un lien vers une classe historique :


Mapping classe prospect :
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Prospect" table="PROSPECT" dynamic-update="true" lazy="true">
     <id name="id" column="ID_PROSPECT">
   <generator class="increment" />
     </id>
     <property name="num_prospect" column="NUM_PROSPECT"/>
     <property name="etat_prospect" column="ETAT_PROSPECT" lazy="true" />
     <property name="dateContact" column="DATE_CONTACT" lazy="true" />

     <bag name="historique" inverse="true" lazy="true" cascade="all" order-by="DATE_HISTO">
   <key column="id_prospect"/>
   <one-to-many class="Historique"/>
     </bag>

</class>
</hibernate-mapping>


Mapping de la classe Historique
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Historique" table="HISTORIQUE" lazy="true">
     <id name="id" column="ID_HISTORIQUE">
   <generator class="increment" />
     </id>
     <property name="dateHisto" column="DATE_HISTO" />
     <property name="description" column="DESCR" />
     <property name="idClient" column="ID_CLIENT" />

     <many-to-one name="prospect" column="id_prospect" not-null="true" lazy="true"/>
   </class>
</hibernate-mapping>


Lorsque je recherche la liste des prospects :
Code:
public Vector getProspect() {
   Session session = HibernateUtil.currentSession();
   Transaction tx = session.beginTransaction();
   List result = session.createQuery("from Prospect").list();
   tx.commit();
   Vector v = new Vector(result.size());
   v.addAll(result);
   return v;
}


Le code SQL géneré par hibernate RESSEMBLE à :
select ... from Prospect
(avec ... etant l'ensemble des attributs de ma classe prospect)
ET plusieurs
select ... from Historique where historique.id_prospect=prospect.id_prospect

Mon problème est donc :
Comment se fait il qu'hibernate me récupère tous les attributs de ma classe Prospect alors que je leur ai définie l'attribut lazy à true (et que je n'y fais aucune référence par la suite ...)
ET encore plus embetant
Comment se fait il qu'hibernate me récupère l'ensemble des historiques correspondant à chaque Prospect alors que je ne fais aucune référence à l'historique et que j'ai mis également l'attribut lazy à true.

Source des 2 beans :
Code:
public class [b]Prospect[/b] {
      private long id;
      private String etat_prospect ="";
      private String num_prospect ="";
      private List historique = new ArrayList();

      public Prospect() {
         super();
      }

      public void setId(long newId) {
         id=newId;
      }
      
      public long getId() {
         return id;
      }
      
      public void setEtat_prospect(String newEtatProspect) {
         if (newEtatProspect!=null) {
            this.etat_prospect=newEtatProspect;
         }
      }
      
      public String getEtat_prospect() {
            return this.etat_prospect;
      }
      
      
      public void setNum_prospect(String newNum_prospect)
      {
      if (newNum_prospect!=null) {
         this.num_prospect=newNum_prospect;
      }   
      }
      
      public String getNum_prospect()
      {
      return this.num_prospect;   
      }

      
      public List getHistorique() {
         return historique;
      }
      
      public void setHistorique(List newHistorique) {
         if (newHistorique!=null) {
           this.historique=newHistorique;   
         }
      }
      
      public void addHistorique(Historique h) {
         if (this.historique!=null & h!=null) {
            h.setProspect(this);
            historique.add(h);
         }
      }
}

public class Historique {
   private long id;
   private Calendar dateHisto;
   private String description;
   private Prospect prospect;
   private String idClient;

   public void setId(long newId) {
         id=newId;
   }
      
   public long getId() {
         return id;
   }
   
   public void setIdClient(String newIdClient) {
      if (newIdClient!=null)
         this.idClient=newIdClient;
   }
   
   public String getIdClient() {
      return this.idClient;
   }
   
   public void setDateHisto(Calendar newDateHisto) {
      if (newDateHisto!=null)
         this.dateHisto=newDateHisto;
   }
   
   public Calendar getDateHisto() {
      return this.dateHisto;
   }
   
   public void setDescription(String newDescription) {
      if (newDescription!=null)
         this.description=newDescription;
   }
   
   public String getDescription() {
      return this.description;
   }
   
   public void setProspect(Prospect newProspect) {
      if (newProspect!=null) {
         this.prospect=newProspect;
      }
   }
   
   public Prospect getProspect() {
      return this.prospect;
   }
   
   
}


Merci d'avance pour votre aide !!!

_________________
HuGuEs


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 02, 2005 11:22 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
C'est très bizarre.

La seule chose que je vois c'est que tu ne fermes pas ta session. Elle doit donc encore être ouverte une fois ta méthode terminée. Es tu sur de ne jamais accéder à l'historique dans une autre méthode ?

Sinon je crois que l'équipe hibernate déconseille l'usage du lazy sur des propriétés simple ainsi que l'usage du dynamic-update (car pas de possibilité de faire un cache de preparedstatement)

seb


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 02, 2005 11:51 am 
Newbie

Joined: Tue Aug 02, 2005 10:50 am
Posts: 6
Merci pour ta réponse.

J'ai enlevé l'attribut lazy des proprietés simple.
J'ai également enlevé l'attribut dynamic-update ca ne changer rien !!!

Je désèspère ...

Je suis également sur de ne faire aucune réference à la classe historique dans les méthodes utilisées (j'ai d'autres méthodes qui font réference à l'objet historique mais je ne les utilise pas dans le cas présent).

Si quelqu'un voit une solution ou une possible explication ...

_________________
HuGuEs


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 02, 2005 11:59 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Aucune idée,

Si tu mets un point d'arrêt à la fin de ta méthode, est ce que les select sur historique sont déjà fait ? Si oui, tu peux faire du pas à pas pour voir à quel moment c'est fait et te lancer dans le débuggage d'hibernate pour voir ce que cela donne (c'est bien foutu donc au bout de quelques temps on comprend le fonctionnement interne, c'est très utile)

Si non, cela signifie que ça vient d'autre part

seb


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.