经常会接触到vo,do,dto的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析。

得出的主要结论是:在项目应用中,vo对应于页面上需要显示的数据(表单),do对应于数据库中存储的数据(数据表),dto对应于除二者之外需要进行传递的数据。

一、实体类

百度百科中对于实体类的定义如下:

实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关。

根据以上定义,我们可以了解到,实体类有两方面内容,存储数据和执行数据本身相关的操作。这两方面内容对应到实现上,最简单的实体类是pojo类,含有属性及属性对应的set和get方法,实体类常见的方法还有用于输出自身数据的tostring方法。

二、领域模型中的实体类

领域模型中的实体

类分为四种类型:vo、dto、do、po,各种实体类用于不同业务层次间的交互,并会在层次内实现实体类之间的转化。

业务分层为:视图层(view+action),服务层(service),持久层(dao)

相应各层间实体的传递如下图

项目中我们并没有严格遵循这种传递关系,但这种和业务层次的关联对我们理解各实体类的作用是有帮助的。(我们没有接触到po的原因,我理解为orm对po进行了封装)

以下是资料的原文,上图是基于此绘制的:

概念:

voview object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。

dtodata transfer object):数据传输对象,这个概念来源于j2ee的设计模式,原来的目的是为了ejb的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。

dodomain object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

popersistent object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应po的一个(或若干个)属性。

模型:

下面以一个时序图建立简单模型来描述上述对象在三层架构应用中的位置

l        用户发出请求(可能是填写表单),表单的数据在展示层被匹配为vo。

l        展示层把vo转换为服务层对应方法所要求的dto,传送给服务层。

l        服务层首先根据dto的数据构造(或重建)一个do,调用do的业务方法完成具体业务。

l        服务层把do转换为持久层对应的po(可以使用orm工具,也可以不用),调用持久层的持久化方法,把po传递给它,完成持久化操作。

l        对于一个逆向操作,如读取数据,也是用类似的方式转换和传递,略。

三、项目中的实体类

项目中常见的实体类有vo,do和dto,命名规则也常是以相应字符串结尾,如*vo.java。但是dto不总是遵循这个规则,而通常与他的用途有关,如写成*query.java,表示存储了一个查询条件。项目中实体类出现的业务层次也没有这么严格,例如我们可以在视图层就组装一个do,也可以将一个vo从持久层传出来,所以与业务分层相关联的划分方法显得有些冗余。从项目代码中抽象出的理解是:vo对应于页面上需要显示的数据,do对应于数据库中存储的数据,dto对应于除二者之外需要进行传递的数据。

java 项目中几种O实体类的概念的更多相关文章

  1. Java 项目中一种简单的动态修改配置即时生效的方式 WatchService

    这种方式仅适合于比较小的项目,例如只有一两台服务器,而且配置文件是可以直接修改的.例如 Spring mvc 以 war 包的形式部署,可以直接修改resources 中的配置文件.如果是 Sprin ...

  2. JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法

    在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法.   这2种方式都可以实现不用persist ...

  3. SuperDiamond在JAVA项目中的三种应用方法实践总结

    SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...

  4. Java项目中每一个类都可以有一个main方法

    Java项目中每一个类都可以有一个main方法,但只有一个main方法会被执行,其他main方法可以对类进行单元测试. public class StaticTest { public static ...

  5. mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_智能标签

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  6. XML在JAVA项目中的作用

    java项目中,xml文件一般都是用来存储一些配置信息 一般的编程, 多数用来存储配置信息 . 拿JDBC来说,可以把数据库连接字符串写到xml,如果要修改数据源,只需要改xml就可以了,没必要再去重 ...

  7. redis在java项目中的使用

    在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用. redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字 ...

  8. JAVA项目中常用的异常处理情况总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

  9. KO ------- 表中字段名和实体类属性名不一致

    -----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就 ...

随机推荐

  1. IEEE 754 浮点数机器表示标准

    32位字长浮点数: 共32位 1 8 23 符号位 解码 尾数 0 +    1 - 移127码 原码,隐含小数点前的首位1 不同数据类型之间转换时,隐藏着一些不容易被察觉的错误,比如int 和 un ...

  2. PowerDesigner逆向工程导入MYSQL数据库总结

    由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 首先现在PowerDesigner,这里提供PD16.5版本链接: http://pa ...

  3. 纯CSS实现图片水平垂直居中于DIV(图片未知宽高)

    <div class="demo"><a href="#"><img src="http://nec.netease.c ...

  4. 微信小程序 关于底部导航设置

    在app.json 中添加 "tabBar": { "color":"#ffffff", "borderStyle":& ...

  5. Advanced Office Password Recovery如何设置快捷方式

    一般软件安装成功之后都会在桌面上形成快捷方式以方便使用,但是一些用户发现Advanced Office Password Recovery这种office密码破解工具安装成功后桌面上没有出现快捷方式, ...

  6. 别再抱怨了,国内这么多优秀的Android资源你都知道吗?

    因为一些大家都知道的原因,android很多官方出品的优秀开发资源在国内无法访问. 国内的同行们对此也做出了很多努力,有很多朋友通过各种手段把很多优秀的资源搬运到了国内,为国内android开发者提供 ...

  7. 给td添加滚动条

    <td><div style="overflow-y:scroll;height:330px;">test</div></td>

  8. bzoj 2648 KD-tree

    稍微看了一下KD-tree的讲义,大概明白了它的原理,但是实现不出来... 所以无耻的抄了一下黄学长的... #include<iostream> #include<cstdio&g ...

  9. USB Keyboard Recorder

    catalogue . 引言 . Device Class Definition for Human Interface Devices (HID) . USB HID Report Descript ...

  10. Javascript和HTML:

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...