热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

模型相关术语:ModelvsDTOvsEntityvsValueObjectvsPojovsBean

此存储库的目标是明确一些术语的含义,这些术语在开发社区中造成了很多混乱。我想提一下,这个澄清将从Java开发人员的角度进行。型模型DTO今天称为数

此存储库的目标是明确一些术语的含义,这些术语在开发社区中造成了很多混乱。我想提一下,这个澄清将从Java开发人员的角度进行。


型模型


DTO

今天称为数据传输对象的模式在 Core J2EE 模式的第一个版本中被错误地称为值对象。该名称在 Core J2EE 模式书的第二版中得到了更正,但名称“值对象”变得非常流行,并且仍用作实际 DTO 的别名。


DTO 的属性:


  • 它在应用程序的最高层使用(如MVC或 Rest控制器)
  • 它只是一个数据容器,用于在层和层之间传输数据。
  • 它们可以聚合更多实体,也可以从某个实体获得部分信息
  • DTO 通常是 java.io.可序列化的(*仅当您要跨 JVM 传输数据时才需要。

DTO示例


public class UserCreationDTO {@Emailprivate String email;@NotNull@Size(min=8, max=20)private String password;public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}


实体Entity

Entity是轻量级持久性域对象。通常,实体表示关系数据库中的表,每个实体实例对应于该表中的一行。


Entity的属性


  • 该类必须使用 javax.持久性.实体注释进行注释。
  • 该类必须具有公共或受保护的无参数构造函数。该类可能具有其他构造函数。
  • 该类不得声明为最终类。任何方法或持久实例变量都不得声明为最终变量。

Entity示例


@Entity
@Table(name = "user")
public class User {@Idprivate UUID id;private String email;private String password;private String firstName;private String lastName;private Long status;public UUID getId() {return id;}public void setId(UUID id) {this.id = id;}// additional getters/setters}

值对象Value Object

值对象本身表示一组固定数据,类似于 Java 枚举。现实世界中价值对象的示例将是货币,颜色.红色,性别。女性、二维坐标 (x, y)、日期范围 [开始日期、结束日期]、日期(年、月和日)等。

值对象的属性

  • 值对象没有任何标识
  • 它完全由其值标识,并且是不可变的
  • 枚举可以被视为值对象

值对象的示例

public class Money {private final double amount;private final String currency;public Money(double amount, String currency) {this.amount = amount;this.currency = currency;}public double getAmount() {return amount;}public String getCurrency() {return currency;}
}

Pojo

Pojo 代表 普通的旧 Java 对象。一个普通的 Java 对象,不受 Java 语言规范强制限制之外的任何限制的约束。它不依赖于任何框架。它们是由 Sun 微系统公司在 EJB 3.0 中引入的。

Pojo的特性:

  • 所有实例变量都应该是私有的
  • 所有访问方法都应该是公开的
  • 不应有任何行为
  • 不应扩展任何类或实现接口
  • 不应使用任何注释 (@Entity)

Pojo的示例

public class EmployeePojo {public String firstName;public String lastName;private LocalDate startDate;public EmployeePojo(String firstName, String lastName, LocalDate startDate) {this.firstName = firstName;this.lastName = lastName;this.startDate = startDate;}public String name() {return this.firstName + " " + this.lastName;}public LocalDate getStart() {return this.startDate;}
}

JavaBean

JavaBean仍然是一个POJO,但引入了一套关于如何实现它的严格规则。

JavaBean的属性:

  • 访问级别 - 我们的属性是私有的,我们公开了获取者和设置者
  • 方法名称 – 我们的获取器和设置器遵循 getX 和 setX 约定(在布尔值的情况下,isX 可用于获取器)
  • 默认构造函数 – 必须存在无参数构造函数,以便可以在不提供参数的情况下创建实例,例如在反序列化期间
  • 可序列化 – 实现可序列化接口允许我们存储状态

JavaBean的示例

public class EmployeeBean implements Serializable {private static final long serialVersiOnUID= -3760445487636086034L;private String firstName;private String lastName;private LocalDate startDate;public EmployeeBean() {}public EmployeeBean(String firstName, String lastName, LocalDate startDate) {this.firstName = firstName;this.lastName = lastName;this.startDate = startDate;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}// additional getters/setters}

书目

  • https://data-flair.training/blogs/pojo-class-in-java/
  • Value Object vs. Data Transfer Object (VO vs. DTO) : Adam Bien's Weblog
  • https://www.baeldung.com/java-pojo-class
  • Entities - The Java EE 6 Tutorial
  • ValueObject


推荐阅读
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
author-avatar
钢铁年代2502883227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有