在应用程序中,至少有两种处理领域对象持久性和ORM的方法。
但是,如果从现在开始,坚持发生在持久模型上,而不是直接在域模型上进行,我们将失去附着性,因为在从域转换为持久对象时(实际上,存储库现在将处理持久对象(而不是直接处理域模型),并仅将结果转换为域对象作为返回类型),
这里有个问题: 在我的基础设施层中,从
- 使用某种ORM(XML或注释)将领域对象直接映射到持久性
- 如果您的领域和持久模型(表列)之间存在很多阻抗不匹配,则进行关注点分离。这意味着,领域对象是持久性无关的,并且存在一些转换到相应的持久对象,后者映射到ORM。
merge
或任何相关功能来重新连接分离的实体到当前事务。
为了理解,让我们假设这个概念上的Java代码:
@Transaction
public void participateToMeeting(String userId, String meetingId){
User user = userRepository.ofId(userId); //returns a User domain type
Meeting meeting = meetingRepository.ofId(meetingId); //returns a Meeting domain type
if(user != null && meeting != null) {
user.participate(meeting); // as attached entity, this would automatically persist the relationship
}
}
但是,如果从现在开始,坚持发生在持久模型上,而不是直接在域模型上进行,我们将失去附着性,因为在从域转换为持久对象时(实际上,存储库现在将处理持久对象(而不是直接处理域模型),并仅将结果转换为域对象作为返回类型),
managedEntity
状态会丢失。 @Transaction
public void participateToMeeting(String userId, String meetingId){
User user = userRepository.ofId(userId); //returns a User domain type (converted from UserPO to User)
Meeting meeting = meetingRepository.ofId(meetingId); //returns a Meeting domain type (converted from MeetingPO to UserPO)
if(user != null && meeting != null) {
userRepository.participateToMeeting(user, meeting);
//although not conventional, adding this kind of method allows to convert User and Meeting to some persistent object: UserPO and MeetingPO, before proceeding to persistence
}
}
这里有个问题: 在我的基础设施层中,从
User
转换为UserPO
时,我丢失了实体“attachment”。因此,在userRepository.participateToMeeting
方法中,我必须再次从数据库中检索UserPO
和MeetingPO
(使它们附加)...因此涉及了两个额外的请求。
有没有更好的做法来处理领域对象/持久化对象的转换而不会有性能损失?
Meeting
聚合根,其中包含一个Schedule
值对象,该值对象包含两个字段:startDate
和endDate
,并将它们分别存储在两个不同的元素中(在我的情况下是“节点”),那么我就会陷入困境。这就是为什么我更喜欢保持这种关注点的分离,即使这会导致额外的努力。 - Mik378