论坛首页 Java企业应用论坛

PO---VO的转换问题。

浏览 16904 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-09-24  
liferay中,如:
UserHBM是po
User是vo
每次从数据库获得数据都得PO<-->VO转换,很麻烦。


UserHBM userHBM = new UserHBM(user.getUserId(),
user.getCompanyId(), user.getPassword(),
user.getFirstName(), user.getMiddleName(),
user.getLastName(), user.getMale(),
user.getBirthday(), user.getEmailAddress(),
user.getSmsId(), user.getAimId(), user.getIcqId(),
user.getMsnId(), user.getYmId(),
user.getFavoriteActivity(),
user.getFavoriteBibleVerse(),
user.getFavoriteFood(), user.getFavoriteMovie(),
user.getFavoriteMusic(), user.getLanguageId(),
user.getTimeZoneId(), user.getSkinId(),
user.getDottedSkins(), user.getRoundedSkins(),
user.getGreeting(), user.getResolution(),
user.getRefreshRate(), user.getLayoutIds(),
user.getComments(), user.getCreateDate(),
user.getLoginDate(), user.getLoginIP(),
user.getLastLoginDate(), user.getLastLoginIP(),
user.getFailedLoginAttempts(),
user.getAgreedToTermsOfUse(), user.getActive());
session.save(userHBM);
session.flush();
}
else {
try {
UserHBM userHBM = (UserHBM)session.load(UserHBM.class,
user.getPrimaryKey());
userHBM.setCompanyId(user.getCompanyId());
userHBM.setPassword(user.getPassword());
userHBM.setFirstName(user.getFirstName());
userHBM.setMiddleName(user.getMiddleName());
userHBM.setLastName(user.getLastName());
userHBM.setMale(user.getMale());
userHBM.setBirthday(user.getBirthday());
userHBM.setEmailAddress(user.getEmailAddress());
userHBM.setSmsId(user.getSmsId());
userHBM.setAimId(user.getAimId());
userHBM.setIcqId(user.getIcqId());
userHBM.setMsnId(user.getMsnId());
userHBM.setYmId(user.getYmId());
userHBM.setFavoriteActivity(user.getFavoriteActivity());
userHBM.setFavoriteBibleVerse(user.getFavoriteBibleVerse());
userHBM.setFavoriteFood(user.getFavoriteFood());
userHBM.setFavoriteMovie(user.getFavoriteMovie());
userHBM.setFavoriteMusic(user.getFavoriteMusic());
userHBM.setLanguageId(user.getLanguageId());
userHBM.setTimeZoneId(user.getTimeZoneId());
userHBM.setSkinId(user.getSkinId());
userHBM.setDottedSkins(user.getDottedSkins());
userHBM.setRoundedSkins(user.getRoundedSkins());
userHBM.setGreeting(user.getGreeting());
userHBM.setResolution(user.getResolution());
userHBM.setRefreshRate(user.getRefreshRate());
userHBM.setLayoutIds(user.getLayoutIds());
userHBM.setComments(user.getComments());
userHBM.setCreateDate(user.getCreateDate());
userHBM.setLoginDate(user.getLoginDate());
userHBM.setLoginIP(user.getLoginIP());
userHBM.setLastLoginDate(user.getLastLoginDate());
userHBM.setLastLoginIP(user.getLastLoginIP());
userHBM.setFailedLoginAttempts(user.getFailedLoginAttempts());
userHBM.setAgreedToTermsOfUse(user.getAgreedToTermsOfUse());
userHBM.setActive(user.getActive());
session.flush();
}
catch (ObjectNotFoundException onfe) {
UserHBM userHBM = new UserHBM(user.getUserId(),
user.getCompanyId(), user.getPassword(),
user.getFirstName(), user.getMiddleName(),
user.getLastName(), user.getMale(),
user.getBirthday(), user.getEmailAddress(),
user.getSmsId(), user.getAimId(),
user.getIcqId(), user.getMsnId(),
user.getYmId(), user.getFavoriteActivity(),
user.getFavoriteBibleVerse(),
user.getFavoriteFood(),
user.getFavoriteMovie(),
user.getFavoriteMusic(), user.getLanguageId(),
user.getTimeZoneId(), user.getSkinId(),
user.getDottedSkins(), user.getRoundedSkins(),
user.getGreeting(), user.getResolution(),
user.getRefreshRate(), user.getLayoutIds(),
user.getComments(), user.getCreateDate(),
user.getLoginDate(), user.getLoginIP(),
user.getLastLoginDate(), user.getLastLoginIP(),
user.getFailedLoginAttempts(),
user.getAgreedToTermsOfUse(), user.getActive
........................................................
这样做有2个问题:
1,要些很多代码,不知道有什么更好的方法。
2,表之间存在关系,如表user中有保存departmenid,但是要页面显示
departname,如果页面直接用po,user.gerdepartmen().getdepartname就可以。如果页面用vo的话,该怎么做?
I,user里增加departname属性,生成vo时根据departmenid来赋值?这样不是很好吧。
II,页面根据departmenid,再读数据据生成一个vo(departmen)?这样更不好吧。
III,user(vo)里加入一个department(vo)属性,每次生成user(vo)时,也初始化它的department(vo)?这样好像变得太复杂了吧。

大家有没有好的解决方案?
   发表时间:2003-09-24  
要用valueObject,也可以用反射自动赋值啊,好像不用这么低效率编程把?
0 请登录后投票
   发表时间:2003-09-25  
为什么不直接把PO当VO使用?
0 请登录后投票
   发表时间:2003-09-25  
要用valueObject,也可以用反射自动赋值啊,好像不用这么低效率编程把?
                          ~~~~~~~~~~~~~~~~~
           如何实现?
0 请登录后投票
   发表时间:2003-09-26  
你试试使用org.apache.commons.beanutils.BeanUtils.copyProperty
0 请登录后投票
   发表时间:2003-09-26  
copyProperties(java.lang.Object dest, java.lang.Object orig)
          Copy property values from the origin bean to the destination bean for all cases where the property names are the same.

/////////////////////////////////
呵呵,这个倒不错,vo还是没有po那么方便。
0 请登录后投票
   发表时间:2003-09-26  
对了,不知道 one-to-one  one-to-many  many-to-many它怎么处理。
0 请登录后投票
   发表时间:2004-02-20  
引用
你试试使用org.apache.commons.beanutils.BeanUtils.copyProperty

    为什么我没有找到这个?是哪个包里的,是commons-beanutils包里的吗?
能不能举个具体例子来看看。
比如,a和b是一对多的关系,查找到b后,通过他们的关系,得到a。但是,页面上需要把两个a和b的值都显示出来。想把a和b合成一个vo,存到list中,再把list传给页面。那么怎么把a和b合成一个vo呢?
多谢了!!
0 请登录后投票
   发表时间:2004-02-20  

org.apache.commons.beanutils.BeanUtils;

BeanUtils.copyProperties(userHBM, user);
反过来
BeanUtils.copyProperties(user, userHBM);

copyProperties拷贝所有同名属性。最好vo与po的属性类型相同,否则的话如果类型不能转化,就会抛出拷贝错误。

引用
a和b是一对多的关系,查找到b后,通过他们的关系,得到a。但是,页面上需要把两个a和b的值都显示出来。想把a和b合成一个vo,存到list中,再把list传给页面。那么怎么把a和b合成一个vo呢

  把a的属性拷贝到新的aVo中,再将每个b的bVo(当然需要转化)add到aVo中的一个ArrayList或Map中.在form中显示aVo属性同时通过Iterator显示ArrayList中的每个bVo的属性。
0 请登录后投票
   发表时间:2004-02-21  
上面的朋友,你能具体说一下么,每太明白你的意思
0 请登录后投票
论坛首页 Java企业应用版

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