论坛首页 Java版 Struts

再谈关于po,vo在struts+hibernate中的使用(讨论)

浏览 40181 次
该帖已经被评为精华帖
作者 正文
时间:2004-04-05
本来这个问题论坛的相关贴子不少,也看了robbin的那篇struts+hibernate关于架构的贴子,有一些疑问,不吐不快.以下是我的观点和疑问:
1.po和actionform不能混为一谈,我也是这样认为的,在开始用struts编成的时候,采用jdbc的模式开发,没涉及到po,只有actionform和vo,举个查询的例子:
[code:1]public ArrayList query(){
Test t;
ArrayList arraylist=new ArrayList();
while(rs.next){
t=new Test();
t.setId(rs.getString(1));
t.setName(rs.getString(2));
arraylist.add(t);
}
return arraylist;
}[/code:1]然后我在action类中获得这个查询结果,通过session.setAttribute();传递到转发的jsp页面.利用标签取出就可以.这里的Test作为vo传递到jsp.
2.采用hibernate后,当然insert,update,delete没有什么区别,不涉及到view层,单以查询为例(这里就是我的疑问的地方):
[code:1]public List getQuery(String id) throws HibernateException{
Session s=HibernateSessionFactory.currentSession();
String queryString = " from Company as u where u.id='"+id+"'";
Query query = s.createQuery(queryString);
List it= query.list();
return it;
}[/code:1]
如果不考虑robbin所说的po不要传到给jsp,那么我会直接在action类中接收这个List类型的数据集中,而不会进行po->vo的转化,那么po就会传递到jsp,但如果考虑到po不能传递到jsp,那么我的查询方法会怎么写呢,
[code:1]public ArrayList getQuery(String id) throws HibernateException{
Session s=HibernateSessionFactory.currentSession();
String queryString = " from Company as u where u.id='"+id+"'";
Query query = s.createQuery(queryString);
List it= query.list();
TestVO t;
for(int i=0;i<it.size();i++){
t=new TestVO();
t.setId(.....);
......
arraylist.add(t);
}
return arraylist;
}[/code:1]这样的话,我需要另外构造一个VO,然后需要把通过hibernate查询 出来的数据集循环一遍,完成po->vo的转化.是不是麻烦了,另外见一帖子,上面的循环方法是这样写的
[code:1]Collection subject_c = new ArrayList();
_session = SessonManager.getSession();

String ids = request.getParameter("id");

Iterator it = _session.iterate("from subject in class com.shm.apply.beans.Subject where subject.id=?",ids ,Hibernate.STRING);

while(it.hasNext())

{
subject_c.add(it.next());
}

_session.close();


request.setAttribute("subjet_data",subject_c);

this.saveToken(request);
return mapping.findForward("success"); [/code:1]
见http://forum.javaeye.com/viewtopic.php?t=297
robbin赞成这种做法,我觉的这样难道不也是把po传到jsp.
所以问题就是,查询是否一定到进行po->vo的转换,如果不转换有什么好的办法.
想听听大家的意见.如果我没说清楚,可以在讨论!
   
时间:2004-04-05
呵呵,规则就是规则,规则也只不过是规则而已。个人认为如果为了完全遵守某个规则而平添麻烦甚至以牺牲性能为代价是不值得的。
   
0 请登录后投票
时间:2004-04-08
虽然,把po->vo转化确实要花费一些时间,但另外一点不的不说的是,如果把po传到jsp页面,那系统的藕合性太大,一旦po改变,系统的各层都要变,我现在做的一个系统,我统一使用po->vo,进行转化,由于资料少,还没有感觉在速度方面有什么特别的异常.
   
0 请登录后投票
时间:2004-04-08
持久层,表示层,业务逻辑层并不是分得那么开的,他们需要通信,如果严格划分这么多PO,VO,什么的,是不是各个层之间还要做数据交换呢?怎么搞得象系统之间的EDI似的。
这么搞太教条了,没有人会这么做的。

我们使用struts,不过不用FormBean因为formBean引用了servlet的一些东西不适宜传递到业务逻辑层,而在三个层次之间共用一个model类来传递数据。
在action类中使用自己的工具类在request中抽取数据封装model,传递给业务层,接受业务层返回的数据设置到request中,在jsp使用jstl解析生成页面。
   
0 请登录后投票
时间:2004-04-08
这样做是强调分层的概念,并不是每个系统都要这样做。
btw,vo可能并不需要po中的所有属性,vo是针对view层的。所以转化一下有利于view层的处理。 :)
   
0 请登录后投票
时间:2004-04-10
其实问题没有那么复杂,通过hql语言查询,返回结果集中包含的是po,那这个时候要不要直接把此数据集返回到jsp页面呢,如果说po最好不要传递到jsp页面(虽然有时候这种方式会更快,更有效率),那么怎么把握这个度呢?
不是说一定要分层,
znjq 写道
这样做是强调分层的概念,并不是每个系统都要这样做。
btw,vo可能并不需要po中的所有属性,vo是针对view层的。所以转化一下有利于view层的处理。 :)

我同意,比如说表里有10列,但我查询显示给用户的可能就5列.
   
0 请登录后投票
时间:2004-04-10
有一种办法,我认为不错,把 actionForm当做VO层 HINERNATE的数据库类当做PO层!
   
0 请登录后投票
时间:2004-04-10
it depends.

如果你要搭一个狗窝,打地基的时候就没必要按摩天大楼的标准去做,对吧?
   
0 请登录后投票
时间:2004-04-13
dhj1 写道
有一种办法,我认为不错,把 actionForm当做VO层 HINERNATE的数据库类当做PO层!

其实网上很多文章都有这种说法,但就我的观点来说,我不倾向于这种,举个例子来说:
现在有个人员资料表(person):
然后,我想通过personid,personname来查询此表,然后显示一些具体的资料,比如除了personid,personname,还有address,email等等,那么这个时候actionForm中只有personid,personname这两个属性,而vo层就很多了.这是一种情况,就是说actionForm中的属性比vo中的属性少很多.另外一种就是vo比actionForm中的少.所以我觉的actionForm当vo层不是很好.个人意见,呵呵!!
   
0 请登录后投票
时间:2004-04-13
你把ActionFormBean当做PO来用,其实最大的问题还不在数据表示的分层上,而在于PO是带状态的,而ActionFormBean是没有状态的,PO被传递到Web层被当做无状态的ActionFormBean,进行修改之后,再回到Session当中被持久化,会带来意想不到的后果,看看这个帖子就知道后果了:

http://forum.javaeye.com/viewtopic.php?t=4233

主要就是因为PO是有状态的 带id这个表示身份的属性 而Web层数据表示是没有状态的 所以如果你把PO传递到Web,进行修改的话 实际上等于在修改PO的状态 你可以想像 如果Web层程序员和持久层程序员不是一个人的话 那么持久层程序员等于他不知道这个PO被修改过的所以他也许本来应该用update的,地方他使用了save 这都有可能 打个比方吧 就好比你使用引用传递方式 而不是值传递方式 当你的代码里面有方法调用你这个对象的时候 你是不知道这个方法是否会修改你的对象值的 那么就有可能造成一些你预期不到的情况
   
0 请登录后投票
论坛首页 Java版 Struts

跳转论坛:
JavaEye推荐