论坛首页 Java企业应用论坛

关于PO与VO转换.

浏览 7931 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-24  
PO与VO转换,看了一些文章还是不清楚.(我的水平低)
疑点:
PO是Hibernate管理的Entity类的对象.
VO是业务层为了完成业务操作而需要的对象.

1:PO与VO应该是一个类的两个对象吗?
2:如果PO与VO是两个类的分别的两个对象.它们之间的转是怎么转的.
我想到的一个方法就是属性值的拷贝.当PO中有另一个Entity对象的成员变量时,深层拷贝.把Entity类型的成员变
量也转成对应的VO类的对象.如果PO中有另一个Entity对象的列表时就更麻烦了.继续copy.

<<Thing in UML>>(第一版)334页这样说:
Value Object 是由Hibernate PO复合而成的一个POJO对象.针对特定的业务需求而设计.一个VO由多个PO组成,
并可通过VO的getter和setter访问实际PO的值.VO是Entity,BusinessControl和Web层之间的标准传输格式.

我分析:
为什么能过VO的getter和setter可以访问实际PO的值.只有一种方法:PO是VO的成员变量,类似于策略模式.
代码:
//下面两个类的Entity类,持久化到数据库的(先不要考虑它们是合关系合理)
class Forum{
    String name = "iteye";
    Integer age = 10;
  
}
class Address(
    String city = "中国";
)
//下面是VO对象的java 类.
class WebSite{
    Forum f = null;
    Address a = null;
    public WebSite(Forum _f, Address _a){
        f = _f;
        a = _a;
    }
   
    public String getName(){
        return f.getName(); 
    }
    public void setName(String name){
        f.setName(name);
    }
    public Integer getAge(){
        return f.getAge();
    }
    public void setAge(Integer age){
        f.setAge(age);
    }
    public String getAddress(){
        return a.getAddress();
    }
    public void setAddress(String address){
        a.setAddress(address);
    }
    //为客户端代码,提供取成员变量的方法.如果是只让EntityControl可以存取.并且EntityControl与WebSite
    //在同一个包中则把下面的方法设置为package访问权限(我认为是这样,不可能让表示层的代码访问下面的方
    //法,我现在先把它们设置为public方法).
    public Forum getForum(){
        return f;
    }
    public Address getAddress(){
        return a;
    }
}

########################################代码完###########################################
小弟正在迷惑中,请高手指路.
谢谢!!!

   发表时间:2012-07-24  
这代码怎么发进来格式这么乱呀.
这个论坛怎么查询我对别人的文章的评论呀?
0 请登录后投票
   发表时间:2012-07-25  
PO = Persistent Object
VO = Value Object

PO是说这个对象是用来持久化的,它是相对与不能持久化的对象而言的。Value Object是DDD中一个术语,是相对于entity提出的概念,vo和entity都代表领域中的对象,但是entity更关注于其标识,value object则更关注于其值。

换句话说,同一个对象既可以是PO,也可以是VO,也可以是PO+VO,也可以什么都不是。这要看设计者的意图,以及从哪个角度去看了。就像男人老人的概念一样,是从不同的角度看问题。
0 请登录后投票
   发表时间:2012-07-25  
letmedown 写道
这代码怎么发进来格式这么乱呀.
这个论坛怎么查询我对别人的文章的评论呀?


您好,您在编辑代码的时候可以使用工具栏上方的Code,这样可以调整代码格式。

如果您需要查询博客的评论,可以在“我的博客”—“评论管理”里面查询评论。
0 请登录后投票
   发表时间:2012-07-25  
查询条件 start date / end date 这两个属性
在PO中没有
所以VO一般是继承PO加点数据库不记的数据....
0 请登录后投票
   发表时间:2012-07-27  
抛出异常的爱 写道
查询条件 start date / end date 这两个属性
在PO中没有
所以VO一般是继承PO加点数据库不记的数据....


嗯 我的看法其实 vo和po可以同一个 entity 对象来表示。

其实大部分 业务 vo 都是多余的。只不过涉及到个别的业务才会有这样的VO
0 请登录后投票
   发表时间:2012-07-27  
ITeye管理员 写道
letmedown 写道
这代码怎么发进来格式这么乱呀.
这个论坛怎么查询我对别人的文章的评论呀?


您好,您在编辑代码的时候可以使用工具栏上方的Code,这样可以调整代码格式。

如果您需要查询博客的评论,可以在“我的博客”—“评论管理”里面查询评论。


谢谢你的回复.
我对一个人的博客中的一个文章进行了评论.好像从---“我的博客”—“评论管理”里面查询评论--中查不到.
只是那个博主对的我评论回复了之后我就可以在---"我的应用"->"我的消息"中可以看到--.如果博主不回复
好像还真看不到我对他的博客中的文章进行了评论.

关于Entity,PO, VO这些东东,我现在认为理解的就这样吧.
以后等到水平再高点,回头再来想.
系统的设计还是以实用为主,能解决实际问题就OK.不要为了技术而技术,是吧.

总结: 谢谢大家的帮助.
0 请登录后投票
   发表时间:2012-07-27  
我感觉除了vo po pojo do dto 等概念大家需要了解外,在项目架构设计中不要太纠结于这些。

目前我们的项目更多的强调敏捷框架,只用domain model 与持久层及表现层打交道。

至于脏数据之类的问题,自然有相应的解决方法。
0 请登录后投票
论坛首页 Java企业应用版

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