在应用程序中,至少有两种方法可以处理域对象持久性和ORM。
正如纯DDD开发人员所知,域不应该被您的数据库需求驱动,因此在我的项目中,我使用了这种关注点分离。有人会想到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
转换为UserPO
(在我的基础设施层中)时,我失去了实体“附件”。因此,在userRepository.participateToMeeting
方法中,我必须再次从数据库中检索UserPO
和MeetingPO
(以使其附加)...因此涉及两个额外的请求。
在没有性能损失的情况下处理转换域对象/持久对象是否有更好的做法?
答案 0 :(得分:3)
我不同意链接的文章。虽然我同意域模型和持久性模型之间的关注点不同,但ORM的整个目的是在域模型和持久性模型之间进行映射。由于ORM应该提供该映射,因此创建额外的类层次结构以便于映射是过度的,并且可能导致类似您所描述的问题。领域模型类似于数据模型的事实确实远远不仅仅是巧合。相反,它们都代表同一领域的方面,因此应具有高度的对应性。 ORM旨在解决对象模型和对应关系模型之间的不匹配问题。在某些情况下,映射变得很难,但在NHibernate中,可以通过实现组件映射的自定义用户类型来解决这些问题。