作者:钢铁年代2502883227 | 来源:互联网 | 2023-09-18 18:19
此存储库的目标是明确一些术语的含义,这些术语在开发社区中造成了很多混乱。我想提一下,这个澄清将从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