• 模型相关术语:Model vs DTO vs Entity vs Value Object vs Pojo vs Bean


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

    型模型

    DTO

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

    DTO 的属性:

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

    DTO示例

    public class UserCreationDTO {
    
        @Email
        private 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 {
    
        @Id
        private 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
     
    }

    书目

  • 相关阅读:
    ELK 企业级日志分析系统 ELFK
    数据结构之拓扑排序
    RDB、AOF 阻塞操作?
    Apollo 应用与源码分析:Apollo工程概述与AUTOSAR架构
    【波形/信号发生器】基于 STC1524K32S4 for C on Keil
    学习Source Generators之打包成Nuget使用
    百度语音识别api使用(Java版本)
    掘光者网课题库接口
    caffeine学习笔记
    【Go语言刷题篇】Go从0到入门5:Map综合复习、条件语句、循环语句练习
  • 原文地址:https://blog.csdn.net/allway2/article/details/127131439