ORM /如何处理Domain对象和Persistent对象之间的对应关系?

在应用程序中,至少有两种方法可以处理域对象持久性和ORM。

  • 使用某种ORM(xml或注释)直接将域对象映射到持久性
  • 在域和持久模型之间存在大量阻抗不匹配的情况下分离关注点 (表格列)。 这意味着,域对象是持久性不可知的,并且对某些对应的持久对象进行了一些转换,后者映射到ORM。

正如纯DDD开发人员所知,域不应该由您的数据库需求驱动 ,因此在我的项目中,我使用这种关注点分离。 有人会想到YAGNI,有人会说“很棒”(就像这里一样)。 根据我对可重用性的需求,我的项目需要一些不同的数据库,因此我选择了我的域模型和持久模型之间的关注点分离。 但是我遇到了Spring-Data的一个问题(某种性能损失)。 一个细节可能,但只是假设一个ORM不具有merge的function,或任何相关的,以将分离的实体重新附加到当前事务。

为了理解,让我们假设这个概念代码(用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方法中,我必须再次从数据库中检索UserPOMeetingPO (以使其附加)…因此涉及两个额外的请求。

在没有这种性能损失的情况下,是否有更好的做法来处理转换域对象/持久对象?

我不同意链接的文章。 虽然我同意域模型和持久性模型之间的关注点不同,但ORM的整个目的是在域模型和持久性模型之间进行映射。 由于ORM应该提供该映射,因此创建额外的类层次结构以便于映射是过度的,并且可能导致类似您所描述的问题。 领域模型类似于数据模型的事实确实远远不仅仅是巧合。 相反,它们都代表同一领域的方面,因此应具有高度的对应性。 ORM旨在解决对象模型和对应关系模型之间的不匹配问题。 在某些情况下,映射变得很难,但在NHibernate中,可以通过实现组件映射的自定义用户类型来解决这些问题。