就数据对象而言,开发(基于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)。但是,在创建/保存实体时,复合对象的问题更大。例如:
假设我 POST
一 UserDto
(其中包含 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之前 UserDto
至 UserEntity
坚持。
注意:这里的dto是我计划用作客户机响应的对象(带有json相关注解)。他们住在 Service
以及 Controller
层,而实体是仅存在于 Repository
以及 Service
层。
暂无答案!
目前还没有任何答案,快来回答吧!