PO
PO(Persistant Object,持久对象) 就是在Object/Relation Mapping框架中的Entity,PO的每个属性基本上都对应数据库表里面的某个字段。完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。持久对象是由insert数据库创建,由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。
PO的全称是:持久对象(persistant object),最形象的理解就是一个PO就是数据库中的一条记录,多条记录可以用PO的集合。PO的属性是跟数据库表的字段一一对应的,由一组属性和属性的get和set方法组成,需要实现序列化接口,可以看成是与数据库中的表相映射的java对象。PO中应该不包含任何对数据库的操作。
在O/R映射的时候出现的概念,如果没有O/R映射,就没有这个概念存在了。通常对应数据模型(数据库),本身还有部分业务逻辑的处理。
关键:
- 一条记录,一个PO;多条记录,PO集合
- PO属性与数据库表字段,一一对应
- 属性,get\set方法,实现序列化接口,不包含数据库操作
- 物理数据的对象表示
VO
不具有唯一标志且符合Java Bean规范的纯Java的对象, VO的属性是根据当前业务的不同而不同,也就是它的每一个属性都与当前业务逻辑所需要的数据的名称一一对应。
关键:
- 属性与业务逻辑所需数据名称一一对应
- 提供可公开访问的方法、可序列化
- 一般不可修改,成员变量应用final修饰(不可变)
- 重写equals()、hashCode(),重写原则是两个对象的"值"相等,equal()和hashCode()必然相等
BO
封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。业务对象(Business Object,BO)是对数据进行检索和处理的组件。是简单的真实世界的软件抽象。业务对象通常位于中间层或者业务逻辑层。
关键:
- 业务逻辑的封装对象
- 包含业务属性或方法的普通javabean
- 程序中的业务处理过程或者工作流程任务
- 处理业务
POJO
POJO(Plain Ordinary Java Object)简单的Java对象,实际类似(但不同)普通JavaBean,是为了避免和EJB混淆所创造的简称。有一些属性及其getter setter方法的类(允许有一个简单的运算属性,不允许有业务方法,不能携带有connection之类的方法),有时可以作为VO或DTO来使用。
关键:
- 一个简单的普通的Java对象
- 不包含业务逻辑或持久逻辑等
- 不是JavaBean、EntityBean等
- 不具有任何特殊角色
- 不继承或不实现任何其它Java框架的类或接口
DAO
DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。DAO位于业务逻辑和持久化数据之间,实现对持久化数据的访问,也就是将数据库操作封装起来。
一个典型的DAO实现有下列几个组件:
- DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。
- DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。
- 数据传递对象:实体类(有些时候叫做值对象VO)。
- 工厂类(数据库连接和关闭工具类): 避免了数据库连接和关闭代码的重复使用,方便修改。
关键:
- 数据访问对象
- 负责持久层的操作,为业务层提供接口(提供访问数据库的抽象接口,或者持久化机制)
- 结合 PO 对数据库进行相关的操作
- 配合 VO 提供数据库的 CRUD 操作
DTO
数据传输对象(DTO)(Data Transfer Object),是展示层与服务层之间的数据传输对象,是数据访问对象(DAO)从数据库中检索数据的数据实体,DTO 是简单对象,它不应该包含需要测试的任何业务逻辑,它通常包含从许多不同来源聚集在一起的大量信息。
关键:
- 简单对象,可以被序列化(Serializable)
- 不能保存一些上下文相关的数据,比如句柄或者引用
- DAO检索数据库的数据实体
- 不应包含需测试的任何业务逻辑(需要在各个层中传输,因此需要隐藏业务逻辑的细节)
- 包含多个数据来源的信息(所能保存的都是一些基本数据类型的数据,或者是一些简单的类的实例,或者是其它的DTO)
对比
- VO与PO
在Hibernate中,最核心的概念就是对PO的状态管理。一个PO有三种状态:
1.transient:瞬态或者自由态 未被持久化的VO,此时就是一个内存对象VO,由JVM管理生命周期。
2.persistent:持久化状态 已被持久化的PO,并且在Session生命周期内,此时映射数据库连接,由数据库管理生命周期。
3.detached:脱管状态或者游离状态 曾被持久化过,但现在和Session已经托管(detached)了,以VO的身份在运行。它还可以进入另一个Session,继续PO状态管理。
- POJO与JavaBean
1.Java Bean 是被容器所创建(如 Tomcat) 的,应具有一个无参的构造器
2.通常 Java Bean 要实现 Serializable 接口用于实现 Bean 的持久性
3.Java Bean 不能被跨进程访问
4.JavaBean是一种组件技术
- POJO、PO、DTO、VO
一个POJO持久化以后就是PO;
直接用它传递,传递过程中就是DTO;
直接用来对应表示层就是VO。
- DAO、DTO
在传统的系统(企业JavaBeans)体系结构,数据传输目标服务的双重目的:第一,他们围绕这个问题,pre-ejb实体不是序列化的;其次,他们含蓄地定义一个组装阶段,所有要使用的数据的提取和整理到数据传输目标之前返回控制[表现层];第三个原因是使用数据传输目标可能是某些应用层不应该能够访问底层的数据访问对象(DAO),从而改变数据。
- DTO、VO
值对象必须是不可变的、可序列化的,其内容必须是可公开访问的。值对象只能通过基于获得的原始值对象的值创建新值对象来更改和持久。
数据传输对象可以从不同的对象中获取属性,并作为一个新对象进行组合以供特定使用。
因此,虽然与传递对象在大多数方面相似,但传递对象是可变的。此外,有一个合理的预期,如果将传输对象返回到原始层,那么它将被持久化。