2010-02-17 5 views
5

Может ли это иметь смысл?Вызов одного DAO из другого DAO?

Скажем, мне нужно получить объект из БД, который имеет отношение к другому объекту (представленным внешним ключом в БД и композицией в моем объекте домена). Если в моем первом DAO я беру данные для объекта 1, затем вызываю dao для объекта 2 и, наконец, (изнутри первого DAO, вызовите сеттера в объекте 1 и дайте ему ранее извлеченный объект 2).

Я знаю, что мог бы сделать соединение вместо этого, но мне кажется более логичным отделить функциональность (вот почему я скептически отношусь к вызову одного дао из другого). Или мне нужно переместить часть логики на уровень сервиса?

Благодаря

Update: Я думаю, что я решил эту проблему с помощью ответов: все, что мне нужно сделать, это добавить следующее к моему отображению объекта 1:

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

Я Бесполезный не нужно ничего менять. Спасибо за помощь!

+0

Я бы сказал, нет, я объяснил в другом потоке http://stackoverflow.com/questions/8988252/can-a-dao-call -dao –

ответ

9

Читая это, я могу только сделать вывод, что, скорее всего, вы делаете это неправильно ..;)

Если настроить ваше отображение прямо между Objecta и ObjectB (может быть OneToOne, OneToMany или ManyToMany), Hibernate (ленивый) автоматически загрузит ссылку с A на B. Это устраняет необходимость запроса второго DAO и установки ссылки ObjectB в ObjectA.

Сделайте это еще на один шаг, и вам даже не понадобится DAO для ObjectB!

+0

Спасибо, что я работаю. Могу ли я, например, получить пример того, как будет выглядеть это сопоставление (у меня нет большой удачи в Google). Кроме того, с правильными отображениями, мне все еще нужно будет указать «соединение» в моем DAO? – oym

+0

@ es11: Я вижу, вы решили свою проблему. Рад, что я мог бы помочь. Чтобы ответить на ваш вопрос: то, что у вас есть, кажется достаточным, поэтому нет, за пределами ваших сопоставлений вам не придется объявлять какое-либо соединение при извлечении ваших объектов из DAO. – Tim

+0

100% согласились с Тимом! –

6

Я лично предпочитаю избегать ссылок между DAO. Если мне нужно данные, получаемые DAO для выполнения другой операции я отвязать объектов DAO:

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

Тогда я впрыснуть как объекты DAO в службе.

Смежные вопросы