6

I am bit confused about what data should a DTO contain. For example let's assume that we have two tables: User, and Orders. Orders table contains id_users, which is foreign key to user table.

Obviously I have two DAOs, MysqlUserDao and MysqlOrdersDao, with crud operations, and two transfer objects User, and Order, in which I store jdbc rowset.

If I want to get the list of users and for each user all his orders how should I do:

1) In my MysqlUserDao create a function: getUsersAndOrders(select users.,orders. from users join orders) And my User DTO should have a OrderList property in where i put orders ?

2) In my MysqlUserDao i create a function getAllUsers(select * from users), and foreach user I use MysqlOrdersDao function getOrder(id_user);

And some clarifications:

1) For each table in database I need to create a DAO object? or just for complex ones? For example products and images, should be 2 dao or just one?

2) a DTO object should have only properties and setter getter, or it is possible to have other methods like convertEuroToUsd etc.

thanks

4

2 回答 2

4

在您的场景中,#1 是最好的选择,因为 #2 会产生过多的开销。

1) 在我的 MysqlUserDao 中创建一个函数:getUsersAndOrders(select users.,orders. from users join orders) 我的 User DTO 应该在我放置订单的地方有一个 OrderList 属性?

澄清: 1:如果你的数据库有一个好的设计,那么为每个表一个DAO是一个好方法。在某些情况下,您可以将 DAO 合并在一起(例如:继承)。

2:是的。它应该是一个普通的 bean(如果需要,也可以是 POJO)。我建议创建另一个层,您可以在其中定义您的工作流程。我似乎有人称这个额外的层为模型,有时是 DataManager,有时只是 Manager。

例如:创建订单时,您应该在订单表中插入一条记录,并在通知表中插入一条记录(因为每次创建订单时最终用户都会收到电子邮件通知)

class OrderManager {
   private OrderDAO oDao;
   private NotificationDao nDao;

   public saveOrder(OrderDTO o) {
      Long orderId = oDao.save(o);
      NotificationDTO n = new NotificationDTO();
      n.setType(NotificationType.ORDER_CREATED);
      n.setEntityId(orderId);
      nDao.save(n);
   }
}

更新: 在大多数情况下,我们可以这样说:

  • “经理”可以处理许多 DAO;
  • DAO 不应包含其他 DAO 并与 DTO 绑定;
  • DTO 可以包含其他 DTO

在处理集合时,有一个重要的想法是 LAZY 或 EAGER 加载。但这是另一个主题:D

于 2013-07-12T23:59:10.593 回答
0

免责声明: + 以下假设这些 DTO 主要用于持久性,即与 DAO 一起使用。+ 这种方法非常面向关系数据库持久性 + 假设用户可以下订单,但订单最多可以有一个用户 + 此外,您希望分别查询/处理订单和用户

我会做以下事情:

  • 用户的 DTO (UserDTO + UserDAO)
  • 订单的 DTO (OrderDTO + OrderDAO)
  • 连接两者的 DTO (UserOrderDTO + UserOrderDAO)
  • 我不会在 UserDTO 中引用任何 OrderDTO
  • 我可能在 OrderDTO 中有对 UserDTO 的引用,作为具有字符串 id 的属性(作为用户 id 的字符串 id),但我也可能没有。我假设后者。
  • 用于管理与订单关联的不同 DAO 的服务应用程序 (OrderSA)

结果代码如下:

class OrderManagerServiceApplication {
   private OrderDAO oDao;
   private UserDao uDao;
   private UserOrderDao uoDao;

   public saveOrder(OrderDTO o, String userId) {
      // Save the order
      Long orderId = oDao.save(o);
      // Save the association to the user who ordered
      UserOrderDTO uodto=new UserOrderDTO(orderId,userId);          
      uoDao.save(uodto);
   }

   public List<OrderDTO> getOrdersForUser(String userId) { 
      // get the orders associated to the user  
      List<String> orderIds=uoDao.getAllForUser(userId);
      // retrieve the order DTOs
      ArrayList<OrderDTO> result=new ArrayList<OrderDTO>();
      for (String orderId:orderIds){
        result.add(oDAO.getOrder(orderId));
      }
      return result;
   }


   public UserDTO getUserForOrder(Stirng orderId) { 
      // get the user associated with the order
      String userId=uoao.getUserForOrder(orderId);
      // retrieve the user DTO
      return uDAO.getUser(userId);
   }

}
于 2018-04-29T18:47:04.203 回答