Bonjour,
Nous venons de faire une migration de Hibernate 3.2.5 (GA) vers Hibernate 3.6.7 (Final).
Après avoir mis à jour nos dialect (on était sur une BDD Sybase 12.5 avec SybaseDialect et on est passé sur une BDD Sybase ASE 15 avec donc le dialecte SybaseASE15Dialect) et 2-3 dépendances Maven (slf4j-log12,...) tout (ou presque) semble fonctionner.
En fait on s'est rendu compte, sur une requête initialement énorme, que cette nouvelle version d'Hibernate duplique certaines jointures (inner join dans notre cas) ce qui peut amener à exploser les limites de 50 tables/vues maxi dans une seule requête (limite dans les spécs de Sybase)
Sans parler de la requête initiale qui pourrait certainement être revue et améliorée, de manière générale nous avons plus de jointures sur les requête, donc des temps de réponse plus long !
Ci-dessous un exemple pour illustrer.
Point de vue relationnel : Un Agriculteur ne peut avoir qu'un seul EtatAgriculteur (relation many-to-one) et peut avoir 'n' Parcelle. Une Parcelle ne peut appartenir qu'à un Agriculteur. Relation depuis l'agriculteur en one-to-many.
La requête complètement bidonnée ci-dessous cherche à récupérer les Parcelle, en y associant les Agriculteur et leur EtatAgriculteur.
J'ai récupéré avec P6Spy le résultat de la traduction SQL faite par Hibernate.
Requête HQL initiale :
Traduction SQL faite par Hibernate 3.2.5.GA
Code : Sélectionner tout - Visualiser dans une fenêtre à part from Parcelle p inner join p.agriculteur as agri inner join p.agriculteur.etatAgriculteur as etat where (p.agriculteur.agrCdn = agri.agrCdn and agri.etatAgriculteur.etatCdn = etat.etatCdn)
Traduction SQL faite par Hibernate 3.6.7.Final :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 select parcelle0_.PAR_CDN as PAR1_36_0_, agriculteu1_.AGR_CDN as AGR1_27_1_, etatagricu3_.ETAT_CDN as ETAT1_33_2_, parcelle0_.PAR_LIB_LB as PAR2_36_0_, parcelle0_.PAR_SURFACE_INT as PAR3_36_0_, parcelle0_.PAR_CADAST_LB as PAR4_36_0_, parcelle0_.AGR_CDN as AGR5_36_0_, agriculteu1_.AGR_NOM_LB as AGR2_27_1_, agriculteu1_.AGR_PRENOM_LB as AGR3_27_1_, agriculteu1_.AGR_ADR1_LB as AGR4_27_1_, agriculteu1_.AGR_ADR2_LB as AGR5_27_1_, agriculteu1_.AGR_ACTIF_ON as AGR6_27_1_, agriculteu1_.AGR_CODPOS_LB as AGR7_27_1_, agriculteu1_.TYPE_CDN as TYPE8_27_1_, agriculteu1_.ETAT_CDN as ETAT9_27_1_, agriculteu1_.AGR_PERE_CDN as AGR10_27_1_, agriculteu1_.COM_CP_RFA as COM11_27_1_, agriculteu1_.COM_INSEE_RFA as COM12_27_1_, agriculteu1_.JUR_CDN as JUR13_27_1_, etatagricu3_.ETAT_LIB_LB as ETAT2_33_2_, etatagricu3_.ETA_RFA as ETA3_33_2_ from PARCELLE parcelle0_ inner join AGRICULTEUR agriculteu1_ on parcelle0_.AGR_CDN=agriculteu1_.AGR_CDN inner join ETAT_AGRICULTEUR etatagricu3_ on agriculteu1_.ETAT_CDN=etatagricu3_.ETAT_CDN where parcelle0_.AGR_CDN=agriculteu1_.AGR_CDN and agriculteu1_.ETAT_CDN=etatagricu3_.ETAT_CDN
Est-ce que quelqu'un saurait m'expliquer pourquoi il y a un inner join de plus avec Hbn3.6.7 et comment y remédier ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 select parcelle0_.PAR_CDN as PAR1_36_0_, agriculteu1_.AGR_CDN as AGR1_27_1_, etatagricu3_.ETAT_CDN as ETAT1_33_2_, parcelle0_.PAR_LIB_LB as PAR2_36_0_, parcelle0_.PAR_SURFACE_INT as PAR3_36_0_, parcelle0_.PAR_CADAST_LB as PAR4_36_0_, parcelle0_.AGR_CDN as AGR5_36_0_, agriculteu1_.AGR_NOM_LB as AGR2_27_1_, agriculteu1_.AGR_PRENOM_LB as AGR3_27_1_, agriculteu1_.AGR_ADR1_LB as AGR4_27_1_, agriculteu1_.AGR_ADR2_LB as AGR5_27_1_, agriculteu1_.AGR_ACTIF_ON as AGR6_27_1_, agriculteu1_.AGR_CODPOS_LB as AGR7_27_1_, agriculteu1_.TYPE_CDN as TYPE8_27_1_, agriculteu1_.ETAT_CDN as ETAT9_27_1_, agriculteu1_.AGR_PERE_CDN as AGR10_27_1_, agriculteu1_.COM_CP_RFA as COM11_27_1_, agriculteu1_.COM_INSEE_RFA as COM12_27_1_, agriculteu1_.JUR_CDN as JUR13_27_1_, etatagricu3_.ETAT_LIB_LB as ETAT2_33_2_, etatagricu3_.ETA_RFA as ETA3_33_2_ from PARCELLE parcelle0_ inner join AGRICULTEUR agriculteu1_ on parcelle0_.AGR_CDN=agriculteu1_.AGR_CDN inner join AGRICULTEUR agriculteu2_ on parcelle0_.AGR_CDN=agriculteu2_.AGR_CDN inner join ETAT_AGRICULTEUR etatagricu3_ on agriculteu2_.ETAT_CDN=etatagricu3_.ETAT_CDN where parcelle0_.AGR_CDN=agriculteu1_.AGR_CDN and agriculteu1_.ETAT_CDN=etatagricu3_.ETAT_CDN
Merci,
Pouce.
Partager