[Hibernate3] Anomalies dans le SQL généré
voila en jetant un coup d'oeil dans les logs, je mes uis apercu qu'Hibernate génere des requetes sql inutiles et incohérente:
g le schéma suivant:
Caracteristique * -------- Carac_Produit --------- * Produit
numC . valeur . numP
libelle
carac_produit est mappé en élément composite pour un Set (donc pas de requete hql possible)
une partie du mapping
Citation:
<hibernate-mapping>
<class name="dao.Produit" table="PRODUIT">
<id name="numProduit" type="int" unsaved-value="null" >
<column name="numProduit" sql-type="int(11)" not-null="true"/>
<generator class="increment" />
</id>
...
<set name="listCaract" table="CARAC_PRODUIT" lazy="true">
<key column="numP"/>
<composite-element class="dao.CaracProduit">
<property name="valeur" column="valeur" />
<many-to-one name="carac" column="numCarac" />
</composite-element>
</set>
</class>
</hibernate-mapping>
pour récupérer les caractéristiques d'un produit + les valeurs associées g la fonction suivante:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
public Set<CaracProduit> getCaractProduitById(int idProduit ) throws Exception {
Session session = this.getSession();
Transaction tx = session.beginTransaction();
Produit p = (Produit) session.load(Produit.class, idProduit);
Set<CaracProduit> lst = p.getListCaract();
for (CaracProduit car: lst){
Hibernate.initialize(car.getCarac());
}
tx.commit();
session.flush();
return lst;
} |
je récupere un produit puis je récupere la liste des carac_produits (valeurs) puis je charge les éléments caractéristiques (a cause du lazy loading)
Voici la requete générée
Citation:
Hibernate: select produit0_.numProduit as numProduit0_, produit0_.libelleP as libelleP7_0_, produit0_.designationP as designat3_7_0_, produit0_.refFourProduit as refFourP4_7_0_, produit0_.prixP as prixP7_0_, produit0_.stockP as stockP7_0_, produit0_.nbConsultation as nbConsul7_7_0_, produit0_.promo as promo7_0_, produit0_.etatP as etatP7_0_, produit0_.refCategorie as refCate10_7_0_, produit0_.refConstructeur as refCons11_7_0_ from PRODUIT produit0_ where produit0_.numProduit=?
Hibernate: select listcaract0_.numP as numP0_, listcaract0_.valeur as valeur0_, listcaract0_.numCarac as numCarac0_ from CARAC_PRODUIT listcaract0_ where listcaract0_.numP=?
Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
Hibernate: select caracteris0_.numCaracteristique as numCarac1_0_, caracteris0_.libelleCarac as libelleC2_10_0_ from CARACTERISTIQUE caracteris0_ where caracteris0_.numCaracteristique=?
et la suite est plus génante:
Citation:
Hibernate: delete from CARAC_PRODUIT where numP=? and valeur=? and numCarac=?
Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
Hibernate: insert into CARAC_PRODUIT (numP, valeur, numCarac) values (?, ?, ?)
pourquoi ce delete et les insert?????