论坛首页 Java企业应用论坛

读hibernate in action 和 PEAA 后发现感到的迷惑

浏览 18691 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-02-18  
在此之前我一直认为一般的分层结构是这样:表现层-〉BO-〉DAO-数据库;可能是我的理解又问题我一直认为DOMAIN OBJECT 就是我理解的BO,看了这两本书的前面几段都提到grain domain object 是包含业务业务逻辑的,和我的理解一致,但是到了后面 O/R mapping 的时候却发现两位大家的处理惊人的一致那就是O/R MAPING ,也就是dao是完全操作bo的,也就是说dao依赖于domain object. Domain object 完全不处理持久化的事务.结构就成了这样的 表现层-〉BO-〉DAO->(domain object,数据库)当然domain object 也不依赖于数据库的. 那么怎么才是作出好的BO呢?难到就是bussiness service这一层才真正对应于BO?但PEAA中建议 bussiness service应该尽量thinner,所有有点迷惑,难道直接爱MVC的控制层里面直接调用dao和domain object?请各位指点一二?
下面的代码<2><3>可以合并为一个操作 order.removeByItemName("tv")
从完全自然的角度来看下面这个用例:
我的订单号是001,我要求取消我定的10样货品中的电视机那一相
那么什么都不考虑.我的最自然的想法大概是这样的(只是个例子流程,当然也不一定要是这么个顺序)
<1>Order: order =getOrderByID(String ID);
<2>orderItems=order.getOrderItems();
<3>orderItems.remove("电视机");
<4>save(order)
这里有个问题<1><4>两个操作放在什么地方呢?
这里有AB两个解决方案:
A:
放在DAO里面(hibernate in action 就是这么作的<意思上是一样的>):
<1>Order: order =OrderDAO.getOrderByID(String ID);
<2>orderItems=order.getOrderItems();
<3>orderItems.remove("电视机");
<4>OrderDAO.save(order)
但是注意了DAO反回的对象是grained domain Object ,也就是OrderDAO依赖于 Order.这个思维也和PEAA的作者思维一致{order.getOrderItems(); 这一步很有可能也需要访问数据库}.但是这也有个问题1和4这部分代码在哪里?SERVICE层orderService?

B:用Order 包装dao 用
<1>Order: order =Order .getOrderByID(String ID);
<2>Map orderItems=order.getOrderItems();
<3>orderItems.remove("电视机");
<4>order .save(order)  
这个方案看上去要更为优雅,mvc 的control层只要了解domain object就可一了,可能测试的时候比较复杂。要操作数据库。而且导致了业务对象依赖于DAO对象。
为什么大师们都选择A方案?
   发表时间:2005-02-18  
关于A方案和B方案的利弊,大家给点意见!
0 请登录后投票
   发表时间:2005-02-18  
这是一个论坛讨论过很多次的话题,建议还是先翻翻历史帖子,我的观点是用A方法。
0 请登录后投票
   发表时间:2005-02-18  
用A  问题是1和4这部分代码在哪里?SERVICE层orderService?
0 请登录后投票
   发表时间:2005-02-18  
如果严格分层的话,是在DAO层来实现。不过如果业务逻辑比较简单,基本上都是数据库的存取查询操作的话,DAO也可以和BO合并。

严格的分层应该是这样子的:

Business Object  - > DAO Interface - > DAO Implements - > Domain Object

DAO Interface定义domain的CRUD操作,DAO Implements编写具体的数据库访问代码,并且处理资源管理(获取数据库连接,释放数据库连接),Business Object调用DAO Interface来完成具体的业务流程,事务控制要放在Business Object的methods上面。
0 请登录后投票
   发表时间:2005-02-18  
我的意思是<1>和<4>这两步骤在哪里调用?就是说在哪里调用DAO的方法.不会在表现层吧,另外,你说的Business Object 和 Domain Object 是什么?区别在哪里?
比如:
<1>Order: order =getOrderByID(String ID);
<2>orderItems=order.getOrderItems();
<3>orderItems.remove("电视机");
<4>save(order)
我这里的Order和OrderItem是Business Object 还是Domain Object?


0 请登录后投票
   发表时间:2005-02-19  
zengdou 写道
我的意思是<1>和<4>这两步骤在哪里调用?就是说在哪里调用DAO的方法.不会在表现层吧,另外,你说的Business Object 和 Domain Object 是什么?区别在哪里?
比如:
<1>Order: order =getOrderByID(String ID);
<2>orderItems=order.getOrderItems();
<3>orderItems.remove("电视机");
<4>save(order)
我这里的Order和OrderItem是Business Object 还是Domain Object?




Order和OrderItem都是domain object,1和4方法定义在DAO Interface,方法的实现是由DAO Implements来做的。1和4方法被BusinessObject所调用。
0 请登录后投票
   发表时间:2005-02-19  
我认为既然是具体的实现,没必要规定1,4方法再那里被调用。

假如。
接口定义如下:
OrderService
createOrder(Order order)。
那么1,4放在xxService是自然的。

但假如定义如下:
OrderService
createOrder().
那么把1,4放在DomainObject又是自然的事情。
0 请登录后投票
   发表时间:2005-02-19  
把1和4方法放在domain object本身会带来很多坏处,传统的Entity Bean就是这样做的,前面好多帖子已经充分讨论过了。
0 请登录后投票
   发表时间:2005-02-19  
to zengdou:
这年头帖子也有盗版的,从标题到例子都和我以前发的帖子一样.大哥偶知道您整理的也挺辛苦可是至少把俺的名号拉上阿.呵呵
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics