【问题标题】:Cycles in mapping Domain models to DTOs将域模型映射到 DTO 的周期
【发布时间】:2017-11-19 14:19:38
【问题描述】:

你能告诉我将 dto 映射到域并返回到具有循环的那个对象的最佳实践是什么?例如我有这两个对象: 用户对象:

public class User {
   private int id;
   private String firstname;
   private String lastname;
   private List<Order> orders;
   // ... some other properties and getters and setters
}

和订单对象:

public class Order {
   private int id;
   private User owner;
}

我应该如何将这些域模型映射到 DTO?这是我的映射函数的示例:

public UserDTO userToDto(User user) {
   UserDTO dto = new UserDTO();

   dto.setIs(user.getId());
   dto.setFirstname(user.getFirsname());
   dto.setLastname(user.getLastname());

   List<OrderDTO> ordersDto = new List<OrderDTO>();

   for (Order order : user.getOrders()) {
      OrderDTO orderDto = new OrderDTO();
      orderDto.setId(order.getId());
      orderDto.setUser(...) // what I should I set here?

      ordersDto.add(orderDto);
   }

   dto.setOrders(ordersDto);

   return dto;
}

orderDto.setUser(...) 函数有问题。你能告诉我什么是最佳实践吗?当我开始逐步映射用户的属性时,我以映射订单结束,我实际映射并创建循环。感谢您的回答。

【问题讨论】:

  • 我假设您会将这些 DTO 序列化为 JSON 或 XML。如果他们有周期会发生什么?你推断出什么?
  • 我还没有创建服务。我只是将任务落实到我的学校项目中,我正在考虑实施。当我开始在 userToDto 函数中实现用户属性时,这些属性之一是订单列表,所以接下来我开始映射订单的属性,用户再次在哪里等等......它循环。我的问题是如何避免这种情况以及最佳做法是什么。我希望解释得更清楚。
  • @davidxxx 我不能使用你的代码,因为 OrderDTO 引用了 UserDTO 而不是 User。我需要将 User 属性映射到 UserDTO 属性。
  • 我想让你在这里思考。 DTO 不应该根据实体是什么来设计的。它应该根据您希望客户收到的内容进行设计。如果他们有周期会发生什么?你的结论是什么?
  • @JBNizet 所以如果我开始将 User 映射到 UserDTO 它将是无限的过程,对吗?我以前从未实施过这些,所以也许我的想法是错误的,你能给我举个例子我该怎么做吗?我在学校的任务没有明确定义。我只知道我应该将实体映射到 dto。所以我尝试将其 1:1 映射。

标签: java persistence dto


【解决方案1】:

首先,我假设您也需要客户端的关系。否则无论如何你都不会对循环有任何问题。 此外,我假设您同时拥有 UserDTO 和 OrderDTO,其中 OrderDTO 将 UserDTO 作为成员(并且 UserDTO 是 OrderDTO 的列表)。

恕我直言,您只需设置

orderDTO.setUser(dto); // where dto is the UserDTO created initially. 

现在你得到了一个循环,在将 DTO 发送到客户端时需要处理它(例如,使用 Rest)。在 JPA 方面,您可能有 @OneToOne(按顺序)和 @OneToMany(按用户)注释。

我推荐使用 jackson 进行 JSON 处理。如果你这样做,你可以使用

// in UserDTO
@JsonManagedReference
private List<Orders> orders;

// in OrdersDTO
@JsonBackReference
private UserDTO owner; 

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多