rest开发后端dto与前端dto之比较

nmpmafwu  于 2021-07-05  发布在  Java
关注(0)|答案(0)|浏览(333)

就数据对象而言,开发(基于json的)rest服务的最佳方法是什么。
我应该将数据库模型(后端)与前端模型分开吗?
始终将与db相关的jpa实体保留到特定的层,然后将它们转换为一组用于前端的dto,这是一种好的做法吗?
例如,三层体系结构: Controller Service Repository 我应该将db实体(用jpa注解注解)限制为 Repository 以及 Service
然后做最后的决定 Controller 仅与另一组ui“实体”(DTO)一起操作?
这将需要在2之间进行某种Map,即自动Map或“手动Map”。
这允许“瘦”前端实体。
例如,在后端,我们只有jpa注解,所有者是一个 Account 参考文献:

@Entity
public class Job {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    @ManyToOne(fetch = FetchType.LAZY)
    private Account owner;

但在前端层,我会有特定于jackson的注解。我不需要全部 Account 对象,但在ui中仅显示其id:

class Job {
 long id;
 String name;
 long ownerId;
}

在尝试了“手动”Map之后,结论是它很快就会变得一团糟。
就我而言,我想要 Repository 返回实体层(jpa)和 Service 层进行Map并返回dto。因此,对于从数据库获取数据来说,这似乎非常经济,只涉及1个Map(从实体到dto)。但是,在创建/保存实体时,复合对象的问题更大。例如:
假设我 POSTUserDto (其中包含 UserProfileDto 作为复合对象)从api客户端到 Controller . 现在 Service 图层将接受 UserDto ,但它必须找到 UserProfileEntity 与之相对应 UserProfileDto .
此外,存储库 .save() 方法返回新持久化的实体。现在,如果我想将它进一步用作另一个对象的一部分,就必须将它Map到dto,然后再Map回entity(否则我将得到 object references an unsaved transient instance - save the transient instance before flushing 错误)。
例如,如果我这样做: repository.save(profileEntity) 这将返回一个新的 ProfileEntity ,但现在我需要把它Map到 ProfileDto 为了让它成为 UserDto 再次Map之前 UserDtoUserEntity 坚持。
注意:这里的dto是我计划用作客户机响应的对象(带有json相关注解)。他们住在 Service 以及 Controller 层,而实体是仅存在于 Repository 以及 Service 层。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题