2010-02-17 5 views
5

Cela peut-il avoir du sens? Dites que je dois récupérer un objet de la base de données qui a une relation avec un autre objet (représenté par une clé étrangère dans la base de données et par une composition dans mon objet domaine). Si dans mon premier DAO je récupère les données pour l'objet 1, alors appelez le dao pour l'objet 2, et enfin (à partir du premier DAO, appelez le setter dans l'objet 1 et donnez-lui l'objet précédemment recherché 2).Appel d'un DAO d'un autre DAO?

Je sais que je pourrais faire une jointure à la place, mais il me semble plus logique de découpler la fonctionnalité (c'est pourquoi je suis sceptique quant à l'appel d'un dao d'un autre). Ou devrais-je déplacer une partie de la logique vers la couche de service?

Merci

Mise à jour: Je pense que je l'ai résolu le problème avec l'aide des réponses: tout ce que je devais faire était d'ajouter ce qui suit à ma cartographie de l'objet 1:

<one-to-one name="Object2" fetch="join" 
     class="com...Object2"></one-to-one> 

Je n Il ne faut rien changer d'autre. Merci pour l'aide!

+0

Je dirais que non, je l'ai expliqué dans un autre thread http://stackoverflow.com/questions/8988252/can-a-dao-call -dao –

Répondre

9

En lisant cela, je ne peux conclure que le plus probable, vous le faites mal ..;)

Si vous configurez vos correspondances entre droit et ObjectA ObjectB (pourrait être OneToOne, OneToMany ou ManyToMany), Mise en veille prolongée va (paresseux) charger automatiquement la référence de A vers B Cela éliminera la nécessité d'interroger le deuxième DAO et définir la référence ObjectB dans ObjectA.

Prenez cette étape un peu plus loin et vous n'aurez peut-être même pas besoin du DAO pour ObjectB!

+0

Merci .. c'est ce que je travaille vers. Pourrais-je avoir un exemple de l'apparence de cette cartographie (je n'ai pas beaucoup de chance sur google). De plus, avec les mappages corrects, aurais-je encore besoin de spécifier une "jointure" dans mon DAO? – oym

+0

@ es11: Je vois que vous avez résolu votre problème .. Je suis heureux d'avoir pu vous aider. Pour répondre à votre question: ce que vous avez semble suffisant, donc non, en dehors de vos mappages, vous n'aurez pas à déclarer une jointure lors de la récupération de vos objets à partir du DAO. – Tim

+0

100% d'accord Tim! –

6

Personnellement, je préfère éviter les références entre les DAO. Si je besoin d'une des données extraites par DAO pour effectuer une autre opération que je découpler les OTI:

// Bad - have to inject Dao into antoher Dao 
class FooDao extends BaseDao { 
    BarDao barDao; 

    public Foo complexLoad() { 
    return doFooStuff(barDao.loadBar()); 
    } 
} 

// Good - dependency on Bar only, not to Dao 
class FooDao extends BaseDao { 
    public Foo complexLoad(Bar bar) { 
    return doFooStuff(bar); 
    } 
} 

J'injectent les deux OTI dans le service.