在应用程序中,至少有两种方法来处理域对象持久性和 ORM。
- 使用某种 ORM(xml 或注释)将域对象直接映射到持久性
- Making 关注点分离如果您的域和持久模型(表列)之间存在大量阻抗不匹配。这意味着,域对象与持久性无关,并且存在一些到某些相应持久性对象的转换,后者映射到 ORM。
正如纯 DDD 开发人员所知,域不应该是driven根据您的数据库需求,因此在我的项目中,我使用了这种关注点分离。有人会想到 YAGNI,有人会说“太棒了”(比如here)。根据我的可重用性需求,我的项目将需要一些不同的数据库,因此我选择了领域模型和持久模型之间的关注点分离。
但我遇到了 Spring-Data 的一个问题(某种性能损失)。
也许是一个细节,但假设一个 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
to UserPO
(in my 基础设施层),我失去了实体“附件”。因此,在userRepository.participateToMeeting
方法,我必须检索UserPO
and MeetingPO
再次从数据库中(以附加它们)...因此涉及两个额外的请求。
是否有更好的实践来处理域对象/持久对象的转换而不会造成性能损失?