Bonjour à tous,

j'ai deux classes AntivirusFirewall et AntivirusFirewallInstallation, qui sont liées tous les deux par une relation one-to-one, telle que définit de la façon suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
<union-subclass name="AntivirusFirewall" table="av_fw">
 
	<property column="numdossier" name="numDossier" not-null="true" type="string" />
 
	<one-to-one cascade="all" fetch="join" class="AntivirusFirewallInstallation" lazy="false" name="Installation" />
 
</union-subclass>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<class name="AntivirusFirewallInstallation" table="av_fw_installation">
 
	<id column="cle" name="Cle" type="string">
		<generator class="foreign">
			<param name="property">AntivirusFireWall</param>
		</generator>
	</id>
 
	<property column="datecreat" name="Date" type="date" />
 
	<one-to-one cascade="all" fetch="join" class="AntivirusFirewall" lazy="false" name="AntivirusFirewall" />
</class>
Le problème est qu'Hibernate me génère la requête suivante (que j'ai simplifié) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
    select
        this_.iduser as iduser109_2_,
        this_.numdossier as referer109_2_,
        avf2_.cle_finale as cle1_116_0_,
        avf2_.datecreat as datecreat116_0_,
        avf3_.iduser as iduser109_1_,
        avf3_.numdossier as referer109_1_,
    from
        av_fw this_ 
    left outer join
        av_fw_installation avf2_ 
            on this_.iduser=avf2_.cle_finale 
    left outer join
        av_fw avf3_ 
            on avf2_.cle_finale=avf3_.iduser 
    where
        this_.numdossier=?
Comme vous pouvez le constater, pour un accès à seulement deux tables, Hibernate génère un select sur la table AntivirusFirewall, un outer join sur la table AntivirusFirewallInstallation pour récupérer l'installation associée, et de nouveau un outer join sur la table AntivirusFirewall pour récupérer l'antivirus associée à l'installation. Je pense que le dernier outer join est inutile puisque les informations qu'il récupère sont exactement les mêmes que pour le select original.

Est-ce qu'il y a moyen de changer mon mapping pour éviter le dernier outer join, consommateur inutile de ressources ?

Merci par avance pour vos réponses,
MiniMarch