DTO、DAO和实体?实体是否必需?使用这三者的最佳实践是什么?

6

我认为如果你正在使用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实体?

非常感谢!祝愿你们成功!


1
这些术语在JPA中具有特定的含义:实体或DTO - 何时使用哪种投影? - jaco0646
@jaco0646,这个回答更接近我的问题,请您发布一下,我可以接受它。 - Hasan Durukan
感谢您提出这个精心制作的问题! - Ahmed Alhallag
2个回答

9
在JPA中,实体和数据传输对象(DTO)是从DAO或Repository返回的两种不同的投影。区别在于,实体是受管理的(Bean),而DTO是未经管理的(简单数据载体)。这使得实体成为数据库的直接表示,而DTO只是一条消息。

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

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

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

相关:


5

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

DTO只应包含私有字段、getter、setter和构造函数。不建议将业务逻辑方法添加到此类中,但可以添加一些实用方法。

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访问它,实体的原因是什么?它只是为了持久性,如果从未初始化实体对象,是否可以? - Hasan Durukan
是的,拥有不同的层级是必要的 - 实体只是用于持久化 - 数据库。 - Andrea Cavallo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接