2010-02-17 25 views
5

¿Puede esto tener sentido alguna vez?¿Llamar a un DAO desde otro DAO?

Digamos que necesito recuperar un objeto del DB que tiene una relación con otro objeto (representado por una clave externa en el DB, y por una composición en mi objeto de dominio). Si en mi primer DAO busco los datos para el objeto 1, entonces invoco el dao para el objeto 2, y finalmente (desde dentro del primer DAO, llamo al setter en el objeto 1 y le doy el objeto previamente capturado 2).

Sé que podría hacer una unión en su lugar, pero me parece más lógico desacoplar la funcionalidad (por lo que soy escéptico acerca de llamar a un dao de otro). ¿O debería mover parte de la lógica a la capa de servicio?

Gracias

Actualizar: Creo que he resuelto el problema con la ayuda de las respuestas: todo lo que tenía que hacer era añadir lo siguiente a mi mapeo de objetos 1:

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

yo no no tiene que cambiar nada más ¡Gracias por la ayuda!

+0

yo diría que no, he explicado en otro hilo http://stackoverflow.com/questions/8988252/can-a-dao-call -dao –

Respuesta

9

Al leer este solo puedo concluir que lo más probable es que estés haciendo mal ..;)

Si configurar sus asignaciones por el centro de Objecta y ObjectB (podrían ser OneToOne, OneToMany o ManyToMany), Hibernate Will (perezosa) cargará la referencia de A a B automáticamente. Esto eliminará la necesidad de consultar el segundo DAO y establecerá la referencia de ObjectB en ObjectA.

¡Avance un paso más y es posible que ni siquiera necesite el DAO para ObjectB!

+0

Gracias ... esto es para lo que estoy trabajando. ¿Podría obtener un ejemplo de cómo se vería este mapeo (no estoy teniendo mucha suerte en google)? Además, con las asignaciones correctas, ¿todavía tendría que especificar una "unión" en mi DAO? – oym

+0

@ es11: veo que has resuelto tu problema ... Me alegro de poder ayudarte. Para responder a tu pregunta: lo que tienes parece suficiente, entonces no, fuera de tus asignaciones no tendrás que declarar ninguna unión al recuperar tus objetos del DAO. – Tim

+0

100% de acuerdo Tim! –

6

Personalmente, prefiero evitar las referencias entre los DAO. Si necesito un datos captados por DAO para realizar otra operación que desacoplar el DAOs:

// 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); 
    } 
} 

Entonces me inyecto ambos DAOs en el servicio.