POJO(普通旧 Java 对象)和 DTO(数据传输对象)有啥区别?

Posted

技术标签:

【中文标题】POJO(普通旧 Java 对象)和 DTO(数据传输对象)有啥区别?【英文标题】:What is the difference between POJO (Plain Old Java Object) and DTO (Data Transfer Object)?POJO(普通旧 Java 对象)和 DTO(数据传输对象)有什么区别? 【发布时间】:2010-11-28 08:37:28 【问题描述】:

我找不到它们之间的区别。有谁知道如何区分它们?

【问题讨论】:

【参考方案1】:

所有 DTO 都是 POJO,但并非所有 POJO 都是 DTO。一个不是 DTO 的 POJO 示例是包含状态和行为(业务逻辑)的业务类。

【讨论】:

“所有 DTO 都是 POJO”非常令人困惑。 DTO 是可序列化的——POJO 不实现任何接口或扩展任何类。这意味着 DTO 不能是 POJO,因为它们已经实现了预先指定的接口 (Serializable)。 @EdwardQuixote 是的,DTO 是可序列化的,而 POJO 则不需要。这就是为什么我们可以说 DTO 是 POJO,但并非所有 POJO 都是 DTO。另一种解读方式是说 DTO 是 POJO 的一种特殊化,因此增加了特性(例如,序列化)。【参考方案2】:

从DTO's wiki的这句话可以理解POJO和DTO的区别:

DTO 是简单的对象,不应包含任何业务逻辑,但可能包含用于通过网络传输数据的序列化和反序列化机制。

此外,Martin Fowler 的Catalog of Patterns of Enterprise Application Architecture 中对 DTO 进行了完美的可视化和详细描述

【讨论】:

【参考方案3】:

POJO 只是一个简单的 Java 对象,首字母缩写词用来强调它确实没什么特别的。

DTO 是一个数据传输对象,用于封装通过层或子系统之间的连接传输的数据。请参阅***文章,它也是一个核心 J2EE 模式 (http://www.oracle.com/technetwork/java/transferobject-139757.html)。

http://en.wikipedia.org/wiki/Data_transfer_object

【讨论】:

我实际上并不确定 POJO 这个词是从哪里来的,我认为它在 EJB 1.x 的黑暗邪恶臭气熏天的 DTO 时代并不存在 这解释了一些 POJO 的起源:en.wikipedia.org/wiki/Plain_Old_Java_Object【参考方案4】:

DTO 是 pojo,但 pojo 不是 dto,因为 pojo 可以有更多的行为但 DTO 基本上没有行为

Oracle 文档有清晰的描述。

【讨论】:

【参考方案5】:

一个 POJO 可以有行为。 POJOs in Action 一书详细介绍了 POJOs 在应用程序开发中的使用。 DTO 是帮助将数据从一层传输到另一层的数据容器。 DTO 不应包含任何行为。

【讨论】:

【参考方案6】:

DTO(数据传输对象):是一种核心 J2EE 设计模式,用于在系统内传输数据。DTO Pattern

POJO(普通旧 Java 对象):它只是人们用来暗示它是一个简单的 Java 对象的首字母缩写词(现在它被大量注释以完成一些有意义的完整工作)。

DTO Pattern J2EE Pattern Catalog

【讨论】:

【参考方案7】:

POJO 或“Plain Old Java Object”是用于描述“普通”Java 对象的名称,与 EJB(最初)或任何依赖于其他技术的“重”对象相对。

DTO 或“数据传输对象”是用于...嗯...传输数据的对象,通常在您的“业务”类和持久层之间。它通常是一个无行为的类,很像 C 风格的结构。它们是一个过时的概念。

【讨论】:

不一定是过时的概念——它们是一种设计模式,仍然用于解决它们所解决的一般问题。它们现在不常用了,因为它们主要用于解决 EJB 的问题——现在不常用... 我说它已经过时的原因是因为当前的趋势是通过行为完全传递OO“业务”或“域”对象,而不是接近无用的非OO对象。我怀疑这种趋势是由于 OO 哲学的改进以及将对象映射到其他表示(如 JPA、Hibernate、JAXB 等)的技术。 使用 JAXB、JPA 等,您不会将对象映射到这些表示。你最终只是注释你的域对象...... 当您注释某些内容以表示“此类属性存储在此数据库列中”时,您将对象映射到另一个表示。注释或映射文件,它仍然是映射。我正是这个意思。正如您所说,它们位于“域”对象上,即不是 DTO。 如果有人放一个类代码会更容易理解!一张图片能说出一千多个单词!【参考方案8】:

POJO = 普通旧 Java 对象

DTO = 数据传输对象

-- 编辑

好吧,这是假设您不知道首字母缩略词的含义。 Pojo 只是一个没有任何继承链的对象。 DTO 存在于您的数据模型中,因此可能遵循将其与给定实体相关联的严格链。

【讨论】:

以上是关于POJO(普通旧 Java 对象)和 DTO(数据传输对象)有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

构建一个应用程序,用于在基于内存的数据库中存储 POJO(普通旧 Java 对象)

POJO, DTO, VO, JavaBean的区别

普通旧 CLR 对象与数据传输对象

POJO,JAVABEAN,Entity,domain,DTO,ejb区别

java的几种对象(po,dto,dao等)

pojo与DTO的区别是啥?