JiveJdon Community Forums
在线242人   首页   主题表   培训咨询   标签   查搜   注册    登陆 RSS
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
RSS google yahoo 365Key网摘 CSDN网摘 添加到百度搜藏 POCO网摘 新浪ViVi QQ网摘
???en_US.forumThreadNext.name??? 下一主题
Go 共有 8 回复(1页) 阅读142次
 发表新帖子   回复该主题贴
maybeiamtooold



发表文章:
注册时间: 2008年01月23日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
请教一个一直以来困扰我的关于DAO模式的问题!!! 2008年01月23日 22:47 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
标签               
首先,对于DAO模式我是非常支持,从开发实践经验来看,将业务逻辑和持久化机制分离确实带来了很大的好处。但有个问题一直没想通,也没有找到好的解决办法,在这里提出来,希望能得到高手的帮忙。

在企业应用的开发中,经常对遇到一些非常复杂的查询,尤其是需要对很多表进行关联查询。而在DAO对象中无法将这种需求封装起来,这就造成不得不在业务逻辑中包含与持久化机制相关的代码(虽然可以做到仅仅是传送一条String型的SQL语句,但毕竟这也与持久层发生了耦合,味道很坏),请问各位高人有没有什么好的办法解决这个问题,谢谢!!!!
banq



发表文章: 11308
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 72人关注
回复:请教一个一直以来困扰我的关于DAO模式的问题!!! 2008年01月24日 09:55 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
>经常对遇到一些非常复杂的查询,尤其是需要对很多表进行关联查询
按照Evans DDD,尽量使用Critirea,也可以将这些SQl作为领域的业务规则。
maybeiamtooold



发表文章: 3
注册时间: 2008年01月23日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
回复:请教一个一直以来困扰我的关于DAO模式的问题!!! 2008年01月24日 22:27 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
谢谢banq的解答。

我也曾考虑过用Criteria这种更加面向对象的方式(纠正一下,应该Criteria是面向对象的SQL,HQL才是完全面向对象的),可惜Hibernate对Criteria的实现还不够完善,官方也推荐HQL。

另外,如果在业务逻辑中使用Criteria就得使用Session,这就还是没办法与持久层实现分离。似乎跟直接传String型的HQL语句到DAO对象的find方法没什么区别,甚至更复杂了。

至于设计为业务规则,也有一定难度,比如本身就是要做一个查询引擎,查询条件就是由用户来动态设置这种情况。

请问还有什么其它更好的办法吗?
[该贴被maybeiamtooold于2008-01-24 22:38修改过]
[该贴被maybeiamtooold于2008-01-24 22:40修改过]
[该贴被maybeiamtooold于2008-01-24 22:43修改过]
wlmouse



发表文章:
注册时间: 2006年11月09日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
回复:回复:请教一个一直以来困扰我的关于DAO模式的问题!!! 2008年01月25日 12:57 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
业务逻辑中怎么会出现Session?HQL语句在业务里出现也不对呀。这些东西通通应该封到DAO里头,Service里一个也不应该出现。
bonepole



发表文章:
注册时间: 2007年10月10日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
re:请教一个一直以来困扰我的关于DAO模式的问题!!! 2008年01月25日 15:52 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
只要建好相应的领域模型,再复杂的多表关联查询DAO中都可以进行封装,查询出来的结果就是你按需求设计的某个领域对象或对象集合,只是这个对象中的各个属性可能分布于很多关联表中,这是一种解决方案。
banq



发表文章: 11308
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 72人关注
回复:回复:请教一个一直以来困扰我的关于DAO模式的问题!!! 2008年01月25日 16:14 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
Criteria比HQL更加OO,HQL才是一种SQL变种。

Evans DDD中专门有一个specification章节讨论这个问题,结合筛选,后面还谈到规格的组合设计,当然如果觉得SQL放在模型specification中不太好,也可以放入仓储中,specification需要和仓储进行交互。

这些方式其实都是说明:将复杂的SQL语句分离,变成模型对象的过滤和筛选,这样,我们就可以动态建立一些过滤器或筛选组件,对来自仓储的领域模型进行层层筛选最后变成客户端需要的结果。

具体可以参考JiveJdon3的一些复杂查询,在JiveJdon3的持久层中很难见到复杂的SQL语句,难道这个论坛不需要复杂的SQL语句?当然不是,而是我们将之分解了,很多组合筛选动作在内存中实现,然后将筛选结果cache,避免多次操作浪费性能。

>业务逻辑中使用Criteria就得使用Session,这就还是没办法与持久层实现分离
这是因为你使用了Hibernate的Criteria,可以制造自己的Criteria,我在JiveJdon3中就这样做了,不依赖持久层。
maybeiamtooold



发表文章: 3
注册时间: 2008年01月23日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
回复:请教一个一直以来困扰我的关于DAO模式的问题!!! 2008年01月25日 19:16 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
谢谢wlmouse,bonepole,banq.

虽然可以通过自建Criteria来实现和持久层的分离,但这算不算重新发明轮子呢?
bonepole



发表文章: 64
注册时间: 2007年10月10日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
re:请教一个一直以来困扰我的关于DAO模式的问题!!! 2008年01月26日 18:31 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
Criteria是完全面向对象的 而hql则不是;
只要自己有创新和需求就不是重新发明轮子,学以至用,用可创新,创新为需!
johnnylzb



发表文章:
注册时间: 2008年02月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
回复:请教一个一直以来困扰我的关于DAO模式的问题!!! 2008年02月25日 11:26 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
非常好的帖子,也是一直困扰我的问题。

Criteria是一种很理想的解决方案,(当然不是指Hibernate的Criteria,即使Hibernate的Criteria将来设计的如何完美,我们也不能让持久层框架直接以它作为查询的OO封装,因为这样我们的持久层使用者,通常是业务层就必须耦合于Hiernate了,所以Criteria应该是独立设计的接口,实现当然可以来源于任何地方,包括Hibernate)。

但,问题还是,要设计一个能符合多种复杂查询的完全OO的Criteria,确实不是一件容易事情,至少Hibernate还没能很好的解决。
标签               
共有 8 回复(1页) Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
正在读取,请等待...
查询本论坛内 回复超过的热门帖子
标题
 
粗体: [b]文本[/b] 斜体: [i]文本[/i] 下划线 [u]文本[/u] 插入网上的图片 [img]http://wwww.xxxx.com/img.ext[/img] 插入代码 [code]程序代码[/code]  插入url链接 [url]http://url[/url] / [url=http://url]URL加下滑线[/url] 上传图片 word文档 Txt等附件
内容
  提交时自动拷贝以上内容到剪贴板 Ctrl+V可取出;提问题前先查询标签列表

使用帮助 手机m.jdon.com RSS add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的软件架构社区 推荐FireFox或Chrome快速浏览本站
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-10 jdon.com

anti spam