让一个类同时作为实体(映射并存储在数据库中)和有效负载(对象序列化并从 REST 端点返回)是否是一种好的做法?
我在某处听说实体永远不应该高于服务层,而应该映射到服务中的 DTO 对象,然后这些 DTO 应该返回给 Controller 。
我个人认为这是不好的做法,因为在这样的类中,我们混合了用于序列化为 JSON 和用于将对象映射到数据库的注释,这使得代码难以阅读。
但也许还有一些其他的争论。你怎么看?
最佳答案
我个人认为将图层分开是一种很好的做法。 我会用以下内容来激励。
假设您有一个客户,客户 A。
客户端 A 通过 Restful 端点集成到您的系统中并需要帐户信息。您对 Rest 端点进行版本控制并返回版本控制的 Account
实体。
@Entity
public class Account {
private Long id;
private String firstname;
private String lastname;
//Getters and setters are omitted for the sake of brevity
}
客户 A 对信息很满意并使用了 6 个月。
6 个月后,您的数据库团队开始清理/重构过程,并将姓氏更改为姓氏,将名字更改为姓名。 以下需要更改,因为所有这些都可能接触到对象:
- 数据库层
- 持久层
- 业务层
- 表现层
如您所见,微小的变化会引发大量变化。 它还破坏了版本化 Restful 端点的契约。
如果实体在业务层中转换为 DTO,则更改将包含在您的应用程序边界内并且影响最小。契约(Contract)也保持不变,客户端无需更改。
关于java - 在 spring boot 中混合实体和 payload (dto) - 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53651300/