gpt4 book ai didi

java - 具有 M :N or 1:N relationships 的实体的数据传输对象

转载 作者:搜寻专家 更新时间:2023-10-31 20:20:51 24 4
gpt4 key购买 nike

我有 2 个实体 - 电影和 Actor - 具有 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;

}

Actor

@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我认为 与其在 EJB 上执行许多远程调用,不如将数据封装在一个值对象中,这种方法显然违反了规则。

在 DTO 中保存 DTO:另一种方法是存储 Actor 的 Dto,而不是其 ID。

public class MovieDto {    

private String name;
private String short_info;

private Map<String, ActorDto> cast;

}

在我看来,这种方法会更快,因为我不必每次需要显示 Actor 姓名时都调用数据库。

这个假设是否正确,还是只存储 ID 会更好(即使考虑到第二种方法的空间消耗)?

此外,第二种方法会导致一个实体有多个 DTO。例如,在查看“电影页面”时我不需要知道 Actor 演过哪些电影,但在查看“ Actor 页面”时我需要知道。

最佳答案

在父 DTO 中嵌入其他 DTO 实例是完全可以接受的。当然,如果对象最终变得非常大,这可能会让人望而却步。因此,这是您必须做出某种权衡的地方。

解决这个问题的一种方法是使用部分表示和完整表示。在不需要完整数据的情况下,可以使用部分表示。在确实需要完整数据的情况下,可以使用完整表示。您甚至可以拥有它,以便完整表示将部分表示嵌入其中(组合)并简单地推迟对其的调用(对于部分数据)。

我之前使用的另一种方法是告诉我的映射器(将实体转换为 DTO)我是否需要完整数据。通过这种方式,映射器可以决定 DTO 是否需要填充额外的数据。

关于java - 具有 M :N or 1:N relationships 的实体的数据传输对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19773753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com