我有代表我的数据库的实体 - 用户、配方和标签。 对于数据操作,我使用 DTO。所以 UserDTO、RecipeDTO、TagDTO。当我定义实体之间的关系时,我使用其基本的 User、Recipe、Tag 形式,但是当我在 DTO 类中定义这些关系时,我使用其 DTO 形式。
例如:
DTO 类看起来像这样
public class UserDTO{
private String name;
private String email
private List<RecipeDTO>
}
public class RecipeDTO{
private String title;
private String description;
private UserDTO user;
}
我知道如何将 DTO 映射到实体,以便我可以对数据库中的数据执行操作 (CRUD)。
private Recipe convertToEntity(RecipeDTO recipeDTO){
Recipe recipe = new Recipe();
recipe.setTitle(recipeDTO.getTitle);
recipe.setDescription(recipeDTO.getDescription);
}
但是RecipeDTO 中也有一个UserDTO,我也需要将其映射到一个实体。我该怎么做? 所以我试图实现映射内部的映射....(??)
我可以想到以下解决方案。
创建将 UserDTO 转换为 User 的方法:
private User convertUser(UserDTO userDTO){
User user = new User();
user.setName(userDTO.getName());
user.setEmail(userDTO.getEmail());
}
然后在将 RecipeDTO 映射到 Recipe 时使用它。
private Recipe convertToEntity(RecipeDTO recipeDTO){
Recipe recipe = new Recipe();
recipe.setTitle(recipeDTO.getTitle());
recipe.setDescription(recipeDTO.getDescription());
//Convert UserDTO
recipe.setUser(convertUser(recipeDTO.getUser()));
}
我不确定这是否是正确的解决方案,因为随着代码变大,映射会越来越多。
你所描述的方法并没有错,而且会起作用,但是这样做确实需要付出很多努力。
业内通常这样做的方式是让图书馆为您完成这项工作。
两个最流行的 Java 映射库是:
https://mapstruct.org/(在编译时使用注释处理并自动生成与示例中基本相同的映射代码)
和
http://modelmapper.org/(使用黑魔法和反射)
它们都很容易设置/学习,并且任何一个都可以完成工作(包括映射嵌套对象,如您的示例),因此请查看“入门”部分并选择您认为更直观使用的那个。
我个人的建议是选择 Mapstruct,因为它的陷阱更少,生成干净的人类可读代码并避免使用反射。
我不知道到什么程度这是针对不同设计策略的解决方案或针对同一设计的不同解决方案,但我只会将 ID 放入 DTO 中并通过 ID 而不是整个实体检索它们。