Bonjour
J'ai un problème avec les relations oneToOne, et leurs chargements explicites.
je m'explique :
j'ai un Objet A mappé sur une table tA et un objet B mappé sur une table Tb avec une relation 1-1 entre les 2 (utilisation de pk)

Mon objectif est de charger l'objet A (via hql)
Dans certain cas je veux uniquement l'objet A et dans d'autre je veux A et l'objet B associé

dans mon mapping j'ai d'abord utilisé sur mon objet A:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
@OneToOne(mappedBy = "a", fetch = FetchType.LAZY)
B b;

Et je lance un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Query q1 = getSession().createSQLQuery(from A where key=XX);
q1.uniqueResult();
et là surprise je vois 2 requêtes partir :
une pour récupéré l'objet A
et une autre pour récupéré l'objet B associé à A
et niveau performance je ne veux pas récupérer une objet dont je n'ai pas besoin.

par contre si je lance un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Query q1 = getSession().createSQLQuery(from A as a left outer join fetch a.b where key=XX);
q1.uniqueResult();
là une seul requête part, et je peux sans problème dans mon code faire un a.getB() sans avoir à nouveau a requeter.


nous avons ensuite trouver la solution de modifier le mapping en rajoutant

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
@OneToOne(mappedBy = "a", fetch = FetchType.LAZY)
 @LazyToOne(LazyToOneOption.NO_PROXY)
B b;
et en instrumentant le code avec org.hibernate.tool.instrument.javassist.InstrumentTask

là le comportement est différent :
si on désire uniquement récupé A et qu'on fait :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Query q1 = getSession().createSQLQuery(from A where key=XX);
q1.uniqueResult();
Là une seul réquete part (c'est ce qu'on veut)

par contre si on veut A et A.b et qu'on fait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Query q1 = getSession().createSQLQuery(from A as a left outer join fetch a.b where key=XX);
q1.uniqueResult();
a.getB();
une seul requete part lors du uniqueResult(). (et on voit bien dans le from qu'il requête les tables tA et tB)
MAIS dès qu'on fait le a.getB()
il lance un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
select * from tB where key =....
et là c'est pas bon du tout

N'y a t'il pas moyen d'avoir une relation oneToOne et de pouvoir requeter exactement ce qu'on veux en HQL et que aucune requete se fasse dans notre dos si on accède à une objet requeter au debut ?

merci