Вызов одного DAO из другого DAO? - PullRequest
5 голосов
/ 18 февраля 2010

Может ли это когда-нибудь иметь смысл?

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

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

Спасибо

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

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

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

Ответы [ 3 ]

9 голосов
/ 18 февраля 2010

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

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

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

6 голосов
/ 18 февраля 2010

Лично я предпочитаю избегать ссылок между 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 в сервис.

1 голос
/ 11 июня 2010
...