【发布时间】:2013-11-15 10:15:48
【问题描述】:
我有 2 个实体 - 电影和演员 - 具有 M:N 关系。在为这些实体设计 DTO 对象时,我不确定正确的方法是什么。
电影
@Entity
@Table(name = "Movies")
public class Movie extends AbstractBusinessObject {
private String name;
private String short_info;
@ManyToMany
private Map<String, Actor> cast;
}
演员
@Entity
@Table(name = "Actors")
public class Actor extends Person{
private String name;
@ManyToMany(mappedBy = "cast")
private Set<Movie> movies;
}
现在关于 DTO: 我遇到了两种处理 1:N 和 M:N 关系的不同方法。
仅保存 ID:
public class MovieDto {
private String name;
private String short_info;
// Long represents Actor's ID
private Map<String, Long> cast;
}
但是正如here 所说,我认为Instead of performing many remote calls on EJBs, the idea was to encapsulate data in a value object,这种方法显然违反了规则。
在 DTO 中保存 DTO: 另一种方法是存储 Actor 的 Dto,而不是其 ID。
public class MovieDto {
private String name;
private String short_info;
private Map<String, ActorDto> cast;
}
在我看来,这种方法会更快,因为我不必在每次需要显示演员姓名时都调用数据库。
这个假设是否正确,还是只存储 ID 会更好(即使考虑到第二种方法的空间消耗)?
另外,第二种方法会导致一个实体有多个 DTO。例如,我在查看“电影页面”时不需要知道演员演过哪些电影,但在查看“演员页面”时我需要知道。
【问题讨论】:
-
你真的需要 dtos 吗?它们通常只是重复的代码。你可以返回一个实体,它只设置了 id 字段
-
尽管它的代码重复(最初),但随着项目的扩大,它简化了很多。简单的例子是前端取决于 UI 设计者,他们并不真正关心实体/域模型是否具有他们试图呈现的信息。所以它的后端工作是聚合信息并通过 DTO 传递给前端。
标签: java web-applications dto