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:
1 2
| @OneToOne(mappedBy = "a", fetch = FetchType.LAZY)
B b; |
Et je lance un
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
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
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 :
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 :
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
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
Partager