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

2023-12-07

在应用程序中,至少有两种方法来处理域对象持久性和 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再次从数据库中(以附加它们)...因此涉及两个额外的请求。

是否有更好的实践来处理域对象/持久对象的转换而不会造成性能损失?


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ORM / 如何处理Domain对象和Persistent对象的对应关系? 的相关文章

随机推荐

  • 如何使用VBS脚本自动登录

    我对此很陌生 我目前正在办公室从事一个项目 并且我已经有了有关如何在一个窗口中打开多选项卡 IE 的脚本 这是我使用的脚本 Const navOpenInBackgroundTab H1000 site1 http site1 com si
  • 想要在 IE8 上的新选项卡中打开[重复]

    这个问题在这里已经有答案了 可能的重复 在新标签页中打开网址 当我在做的时候window open 我的页面在新窗口中打开 但我希望它在浏览器的新选项卡中打开 怎样才能做到这一点呢 我 99 确定你不能 Redmond 浏览器可能总是有一个
  • android ProgressBar在下载过程中更新

    在我的文件下载应用程序中 有一个 ListView 每一行都包含属性文件和一个用于下载其状态的进度栏 我使用视图持有者模式 但进度栏不更新 Override protected void onProgressUpdate Long valu
  • Selenium 驱动的 ChromeDriver 找不到 Chrome 二进制文件

    我刚刚卸载了 Chrome 因为它表现得很奇怪 现已修复 之后 Python 中的 Selenium 无法识别 Chrome 驱动程序二进制文件 这非常奇怪 因为它应该完全不受影响 并且位于不同的位置和不同的版本从我在桌面上使用的 Chro
  • 如何从 OData Atom feed 反序列化对象?

    我正在尝试解析来自 OData REST 服务的响应 当响应是JSON格式时 很容易使用ReadAsJsonDataContractWCF REST 入门工具包中的方法 然而 如果响应是 Atom feed 事情似乎会更加复杂 这是一个例子
  • 根据余弦相似度值进行聚类

    我从一组 URL 中提取了单词 并计算了每个 URL 内容之间的余弦相似度 而且我还标准化了 0 1 之间的值 使用最小 最大 现在我需要根据余弦相似度值对 URL 进行聚类以查找找出类似的 URL 哪种聚类算法最合适 请建议我一种动态聚类
  • 应用程序安装失败:未知错误 Xcode 7

    我的应用程序在模拟器中运行良好 但当我尝试将其安装在 iPhone 上时 它说 应用程序安装失败 发生未知错误 我打开设备日志并得到以下信息 11 月 12 日 21 17 19 Isaacs iPhone Streaming zip co
  • 简化为派系问题

    子图同构 我们有图 G 1 V 1 E 1 G 2 V 2 E 2 Question 图 G 1 与 G 2 的子图同构吗 即 是否存在 G 2 V V 2 的顶点子集和 G 2 E E 2 边的子集 使得 V V 1 和 E E 1 并且
  • 是否保证新实体的数字自增ID始终大于现有ID?

    是否保证新实体的自动递增ID始终大于现有ID 基本上 我想定期将后台任务中的实体 例如评论 转储到客户创建的大块中 因此 如果现在有 100 个实体 我会将它们存储在 blob 中 并为该 blob 创建辅助实体 例如 class Blob
  • Google Apps 脚本:使用电子表格范围作为参数从菜单调用函数[重复]

    这个问题在这里已经有答案了 我有一个函数 它接受电子表格范围作为参数 然后在给定范围的同一行中添加日期 function autoDate cell var currentDate new Date var currentMonth cur
  • Entity Framework Core 多对多导航问题

    Entity Framework Core 尚未实现多对多关系 如 GitHub 问题中所述 1368 但是 当我按照该问题中的导航示例或类似的答案在 Stack Overflow 上 我的枚举未能产生结果 我的照片和标签之间存在多对多关系
  • 无法比较 SqlBulkCopy 中的列

    这是我的代码 protected void Button1 Click object sender EventArgs e string strFileType System IO Path GetExtension FileUpload1
  • “对齐陷阱”错误意味着什么?

    我的一位朋友在尝试调试开始显示 对齐陷阱 错误的代码时遇到了一个大问题 当特定函数访问全局结构时 就会出现问题 经过在网络上的一些研究 仍然不清楚 对齐陷阱 是什么意思或是什么 有人可以给出一个解释 特别注意通常导致对齐陷阱的原因以及解决问
  • ActionEvent e 是什么意思?

    我正在学习 Java 非常想更深入地了解 ActionEvent e 参数的含义和代表的含义 当我编码时 我不只是想吐出有效的代码 但我不明白 我想在使用概念之前充分理解它们 那么它具体要求什么以及两个部分 ActionEvent 和 e
  • 使用 tidytext 和 broom 但没有找到 LDA_VEM 的 tidier

    tidytext 书中提供了主题模型 tidier 的示例 library tidyverse library tidytext library topicmodels library broom year word counts lt t
  • 扩展 Mach-O 文件中的部分

    我正在尝试从 Dyld shared cache 中提取库 并且需要修复外部引用 例如 中的指针 DATA objc selrefs部分通常指向 mach o 文件外部的数据 为了解决这个问题 我必须从 dyld 复制相应的 c 字符串并将
  • “分段错误(核心转储)”:libioP.h、printf-parse.h、vfprintf-internal.c 等的“没有此类文件或目录”

    核心转储文件中的示例错误 1289 vfprintf internal c No such file or directory 111 printf parse h No such file or directory 948 libioP
  • MVC 中公共字段与属性的数据注释

    为什么 DataAnnotations 不适用于公共字段 例子 namespace Models public class Product Display Name Name public string Title get set publ
  • React Native:如何将 require(path) 与动态 url 一起使用?

    我想使用WebView来显示一些html内容 这是一个例子 return
  • ORM / 如何处理Domain对象和Persistent对象的对应关系?

    在应用程序中 至少有两种方法来处理域对象持久性和 ORM 使用某种 ORM xml 或注释 将域对象直接映射到持久性 Making 关注点分离如果您的域和持久模型 表列 之间存在大量阻抗不匹配 这意味着 域对象与持久性无关 并且存在一些到某