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:
1
2 @OneToOne(mappedBy = "a", fetch = FetchType.LAZY) B b;
Et je lance un
et là surprise je vois 2 requêtes partir :Code:
1
2 Query q1 = getSession().createSQLQuery(from A where key=XX); q1.uniqueResult();
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
là une seul requête part, et je peux sans problème dans mon code faire un a.getB() sans avoir à nouveau a requeter.Code:
1
2 Query q1 = getSession().createSQLQuery(from A as a left outer join fetch a.b where key=XX); q1.uniqueResult();
nous avons ensuite trouver la solution de modifier le mapping en rajoutant
et en instrumentant le code avec org.hibernate.tool.instrument.javassist.InstrumentTaskCode:
1
2
3 @OneToOne(mappedBy = "a", fetch = FetchType.LAZY) @LazyToOne(LazyToOneOption.NO_PROXY) B b;
là le comportement est différent :
si on désire uniquement récupé A et qu'on fait :
Là une seul réquete part (c'est ce qu'on veut)Code:
1
2 Query q1 = getSession().createSQLQuery(from A where key=XX); q1.uniqueResult();
par contre si on veut A et A.b et qu'on fait :
une seul requete part lors du uniqueResult(). (et on voit bien dans le from qu'il requête les tables tA et tB)Code:
1
2
3 Query q1 = getSession().createSQLQuery(from A as a left outer join fetch a.b where key=XX); q1.uniqueResult(); a.getB();
MAIS dès qu'on fait le a.getB()
il lance un
et là c'est pas bon du toutCode:select * from tB where key =....
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