从另一个DAO召唤一个DAO?

时间:2010-02-17 22:43:59

标签: java hibernate spring dao

这可能有意义吗?

假设我需要从DB获取一个对象,该对象与另一个对象有关(由DB中的外键表示,并由我的域对象中的组合表示)。如果在我的第一个DAO中我获取对象1的数据,则调用对象2的dao,最后(在第一个DAO中,调用对象1中的setter并为其提供先前获取的对象2)。

我知道我可以做一个连接,但我觉得解耦功能似乎更合乎逻辑(这就是为什么我对从另一个人调用一个dao持怀疑态度)。或者我应该将一些逻辑移到服务层吗?

由于

更新:我想我在答案的帮助下解决了这个问题:我需要做的就是将以下内容添加到对象1的映射中:

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

我没有必要改变其他任何东西。谢谢你的帮助!

3 个答案:

答案 0 :(得分:9)

在阅读本文时,我只能得出结论,最有可能的是,你做错了......;)

如果在ObjectA和ObjectB之间设置映射(可能是OneToOne,OneToMany或ManyToMany),Hibernate将(懒惰)自动将引用从A加载到B. 这将消除查询第二个DAO的需要,并在ObjectA中设置ObjectB引用。

更进一步,你可能甚至不需要为ObjectB提供DAO!

答案 1 :(得分: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注入服务。

答案 2 :(得分:1)