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

时间:2013-07-15 08:44:30

标签: c# java orm domain-driven-design repository-pattern

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

  • 使用某种ORM(xml或注释)直接将域对象映射到持久性
  • 在您的域与持久模型(表格列)之间存在大量阻抗不匹配的情况下,分离关注点。这意味着,域对象是持久性不可知的,并且对某些相应的持久对象进行了一些转换,后者映射到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方法中,我必须再次从数据库中检索UserPOMeetingPO(以使其附加)...因此涉及两个额外的请求。

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

1 个答案:

答案 0 :(得分:3)

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