DTO、DAO 和实体?是实体需要吗?那三个的最佳实践?

Posted

技术标签:

【中文标题】DTO、DAO 和实体?是实体需要吗?那三个的最佳实践?【英文标题】:DTO, DAO and Entity ? Is Entity needed ? Best pratice with those 3? 【发布时间】:2021-12-19 08:37:09 【问题描述】:

我假设如果您使用的是 DTO 和 DAO,则不需要实体,至少我以这种方式看到的示例是这样。或者在这种情况下是否有实体是可选的?

public interface CustomerResource 

    @GET
    @Path("/getCustomerListByUserID/userID")
    Response getCustomerListByUserID(@PathParam("userID") String userID);

    @DELETE
    @Path("/deleteCustomer/customerID")
    Response deleteCustomer(@PathParam("customerID") int customerID);

    @POST
    @Path("/updateCustomer")
    Response updateCustomer(CustomerDTO customer);
 


public class CustomerResourceImpl implements CustomerResource

 @Override
 public Response deleteCustomer(int customerID) 
     internalService.deleteCustomer(customerID);
 

 @Override
 public Response getCustomerListByUserID(String userID) 
     internalService.getCustomerListByUserID(customerID);
 

 @Override
 public Response updateCustomer(CustomerDTO customer) 
     internalService.updateCustomer(customer);
 


public interface CustomerDAO extends BaseDAO<CustomerDTO> 
 
     List<CustomerDTO> getCustomerListByUserID(String userID);
 
     void deleteCustomer(Integer customerID);
 
     void updateCustomer(CustomerDTO customer);
 

而 internalService 直接调用 CustomerDAO

这个结构有什么问题吗,怎样才能更好,是否需要Customer实体?

非常感谢! 祝大家成功!

【问题讨论】:

这些术语在 JPA 中具有特定含义:Entities or DTOs – When should you use which projection? @jaco0646 这是对我问题的更接近的答案,你能把它贴出来让我接受吗。 【参考方案1】:

DTO是Data Transfer Object的缩写,用于在应用程序的类和模块之间传输数据。

DTO 应该只包含数据、getter、setter 和构造函数的私有字段。 DTO 不建议在此类类中添加业务逻辑方法,但可以添加一些 util 方法。 DAO 是 Data Access Object 的缩写,因此它应该封装用于在数据存储(数据库、文件系统等)中检索、保存和更新数据的逻辑。

以下是 DAO 和 DTO 接口的示例:

interface PersonDTO 
    String getName();
    void setName(String name);
    //.....


interface PersonDAO 
    PersonDTO findById(long id);
    void save(PersonDTO person);
    //.....


@Entity
public class Person 
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
protected String name;
...getter and setter

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

【讨论】:

我以前看过所有这些,我理解每个的含义,我要求的是“如果我们通过 dto 传输数据并通过 dao 访问它是什么实体的原因是它只是为了持久性,如果它从不初始化实体对象就可以了吗? 是的,是有不同的层——实体只是为了持久化——数据库【参考方案2】:

在 JPA 中,Entities vs DTOs 是两个不同的投影,可以从您的 DAO 或存储库返回。不同之处在于实体是托管的(bean),而 DTO 是非托管的(简单的数据载体)。这使得实体成为数据库的直接表示,其中 DTO 只是一条消息。

Entity == 数据库表(以对象形式),维护到持久层的链接 DTO == 可能(或可能不)表示一个或多个表但不引用持久层的数据

请注意,现代 Java 中的“对持久层的引用”通常是通过注释来处理的。

由于人们对这些术语的使用松散且可互换,因此在谈话中并不总是遵循 JPA 的区别;但这是区分定义的一种明确方法。

相关:

Difference between Entity and DTO What is the difference between DAO and Repository patterns?

【讨论】:

以上是关于DTO、DAO 和实体?是实体需要吗?那三个的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

向客户端发送数据的最佳实践是啥:返回实体还是 dto? [关闭]

Gwt-rpc 仅使用 DAO。摆脱 DTO

我应该将 DTO 映射到客户端和服务器端的域实体/从域实体映射吗?

采用DTO和DAO对JDBC程序进行进一步优化

Java DTO(data transfer object)的理解

这是使用 Mapper 映射实体和 dto 的正确方法吗?