从另一个 DAO 调用一个 DAO?

Posted

技术标签:

【中文标题】从另一个 DAO 调用一个 DAO?【英文标题】:Calling one DAO from another DAO? 【发布时间】:2011-01-18 02:32:13 【问题描述】:

这有意义吗?

假设我需要从数据库中获取一个与另一个对象有关系的对象(由数据库中的外键和我的域对象中的组合表示)。如果在我的第一个 DAO 中获取对象 1 的数据,然后调用对象 2 的 dao,最后(在第一个 DAO 中,调用对象 1 中的设置器并将之前获取的对象 2 提供给它)。

我知道我可以改为进行连接,但对我来说,将功能解耦似乎更合乎逻辑(这就是为什么我对调用一个 dao 与另一个 dao 持怀疑态度的原因)。还是应该把一些逻辑移到服务层?

谢谢

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

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

我不需要更改任何其他内容。感谢您的帮助!

【问题讨论】:

我会说不,我已经在另一个线程中解释了***.com/questions/8988252/can-a-dao-call-dao 【参考方案1】:

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

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

更进一步,您甚至可能不需要 ObjectB 的 DAO!

【讨论】:

谢谢..这就是我正在努力的方向。我能否举个例子说明这个映射的外观(我在谷歌上运气不太好)。此外,如果映射正确,我是否仍需要在我的 DAO 中指定“加入”? @es11:我看到你已经解决了你的问题。很高兴我能帮上忙。回答您的问题:您所拥有的似乎已经足够了,所以不,在您的映射之外,您在从 DAO 检索对象时不必声明任何联接。【参考方案2】:

我个人更喜欢避免 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 都注入到服务中。

【讨论】:

【参考方案3】:

http://www.theserverside.com/discussions/thread.tss?thread_id=32661

这对你有帮助..

【讨论】:

以上是关于从另一个 DAO 调用一个 DAO?的主要内容,如果未能解决你的问题,请参考以下文章

访问:使用从另一个查询中选择的 DAO.recordset 运行查询

DAO调用DAO,DAO调用服务还是SQL join?

java中如何调用DAO

我在service层中的一个方法,调用dao层中三个方法怎么保证这三个方法事务统一

9-4DAO首页大接口Dao层实现和调用-1

Java项目,bean类,dao包,service包,action包,现在想用action调用数据库中数据,数据在bean里有get set