DTO、DAO 和实体?是否需要实体?这 3 个的最佳实践?

DTO, DAO and Entity ? Is Entity needed ? Best pratice with those 3?

我假设如果您使用的是 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实体?

非常感谢! 祝大家成功!

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

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

下面是 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
}

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

中的一行

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

  • 实体==数据库table(以对象形式)维护一个link到持久层
  • DTO == 可能(或可能不)代表一个或多个 table 但没有引用持久层的数据

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

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

相关:

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