从另一个 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 运行查询
我在service层中的一个方法,调用dao层中三个方法怎么保证这三个方法事务统一
Java项目,bean类,dao包,service包,action包,现在想用action调用数据库中数据,数据在bean里有get set