![](/img/trans.png)
[英]Is M:N a bad style in OOP? Are there better to manage m:n relationships?
[英]Data Transfer Objects of entities with M:N or 1:N relationships
我有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;
}
然而,正如我所说的那样,我认为Instead of performing many remote calls on EJBs, the idea was to encapsulate data in a value object
, 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。 例如,我不需要知道演员在观看“电影页面”时播放的电影,但在查看“演员页面”时我需要这样做。
将其他DTO实例嵌入父DTO中是完全可以接受的。 当然,如果对象最终非常大,这可能会变得令人望而却步。 所以这是你必须做出某种权衡的地方。
解决这个问题的一种方法是使用部分表示和完整表示。 如果您不需要完整数据,则可以使用部分表示。 如果您确实需要完整数据,则可以使用完整表示。 你甚至可以拥有它,以便完整的表示在其中嵌入部分表示(组合),并简单地将调用推迟到(对于部分数据)。
我之前使用的另一种方法是告诉我的mapper(将实体转换为DTO),如果我需要完整的数据。 通过这种方式,映射器可以决定是否需要使用其他数据填充DTO。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.