DDD - 使用 Doctrine 2 的有界上下文之间的关联映射

2024-02-25

我正在努力理解使用 Doctrine 2 实现来自不同有界上下文的两个实体之间的关联映射的正确方法。假设有两个“User”和“Post”实体分别属于“User”和“Content”有界上下文。 “内容”上下文中还有一个“用户”概念,它通过多对一关联确定“帖子”的作者。因此,“内容”上下文中的“用户”只是一个包含用户 ID 的值对象。

我的问题是我应该如何使用 Doctrine 2 来实现这种关联?我有两个解决方案,它们都有自己的问题:

解决方案1:

/**
 * @ORM\Entity
 * @ORM\Table(name="posts")
 * @ORM\HasLifecycleCallbacks()
 */
 class Post
 {
    ...

    /**
     * @ORM\ManyToOne(targetEntity="UserBC\User", inversedBy="posts")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;

    ...
 }

解决方案2:

/**
 * @ORM\Entity
 * @ORM\Table(name="posts")
 * @ORM\HasLifecycleCallbacks()
 */
 class Post
 {
    ...

    /**
     * @ORM\Column(type="integer")
     */
    private $user_id;

    ...
 }

在第一个解决方案中,“用户”上下文中的“用户”实体已在“内容”上下文中使用,这违反了 BC 彼此独立的 DDD 规则。第二种解决方案遵循 DDD 规则,但会影响数据库架构(通过外键约束删除“users”和“posts”表之间的数据库级关系)。

那么,实施此类关联的正确方式是什么呢?


第二个解决方案是正确的。

正如您所观察到的,应该避免不同 BC 之间的关联。引用另一个 BC 中的实体的正确方法是通过 ID。

这导致 BC 在 DB 中之间没有约束。毕竟,你试图让他们独立。如果你觉得这是错误的,那么解决这个问题的唯一方法就是重新考虑你的 BC 设计,即合并两个 BC。然而,这个决定不应该由代码气味驱动,而应该由上下文映射驱动。

注意:仅当其他 BC 是聚合根时才允许通过 ID 引用实体。如果引用的实体不是 AR,那么您就会有另一种设计味道。虽然不是一个严重的问题,但仍然需要考虑。

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

DDD - 使用 Doctrine 2 的有界上下文之间的关联映射 的相关文章

  • Hibernate @OneToMany 注释到底是如何工作的?

    我对 Hibernate 还很陌生 我正在通过教程学习它 我在理解到底如何一对多注释作品 所以我有这两个实体类 Student代表一个学生并且Guide代表指导学生的人 因此 每个学生都与一名向导相关联 但一名向导可以跟随多个学生 我想要一
  • 在非持久字段更改上保留实体

    我有一个具有 plainPassword 和密码属性的实体 在表单中 我映射到 plainPassword 之后 当用户验证表单时 我对 plainPassword 进行密码验证 为了对密码进行编码 我使用了监听 prePersist 和
  • Doctrine2:入门教程“没有要处理的元数据类”

    我已经将本教程的第一部分运行了三遍 到目前为止 在这里或其他地方进行的大量搜索都无法帮助我使其发挥作用 我收到 没有要处理的元数据类 当我尝试时 php vendor bin doctrine orm schema tool update
  • 如何使用 Spring Crud/Jpa Repository 实现 DDD

    我想通过使用 Spring 实现 DDD 来创建一个应用程序 假设我有一个业务实体 Customer 和一个接口 CustomerRepository 由于春天提供了CrudRepository and JpaRepository默认情况下
  • Android 中的 Sugar ORM:更新 SQLite 中保存的对象

    我是在 Android 上使用 SQLite 和 Sugar ORM 进行应用程序开发的新手 并尝试阅读 Sugar ORM 文档 但没有找到有关如何更新 SQLite 中保存的对象的任何信息 更改对象属性后还可以保存对象吗 就像是 Cus
  • Doctrine make:迁移未知数据库类型

    我正在尝试开始使用 Doctrine 但是在通过创建实体时遇到了问题php bin console make entity 然后我尝试进行迁移php bin console make migration但我收到此错误消息 请求未知的数据库类
  • greendao list查看实体中的所有数据

    格林道 其中有一个简单的方法可以在ListView中显示来自Entity的所有记录 并且支持自动更新列表 也许是 Lazylist 类 如何使用它 看一看here https groups google com forum fromgrou
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 如何将当前用户信息传递到 DDD 中的所有层

    类似的问题以前曾被问过 但不完全相同 除非我错过了 我想通过我的服务 域 域事件 域事件处理程序传递 IUserInfo 类实例 什么是最好的方法 我是不是该 通过注册使用 IoC 注入它 针对 Httpcontext Current se
  • 通俗地说,Ruby on Rails ORM 是什么?请解释

    我无法理解 Ruby on Rails 中的 ORM 据我了解 表 列和对象 属性之间存在 1 1 的关系 所以每条记录都是一个对象 另外 模型到底是什么 我知道它映射到一张桌子 我真正追求的是对上述内容有更深入的理解 预先感谢您的帮助 我
  • Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证

    我可以在 Hibernate 中使用 MySQL 视图 将它们视为表 即 该实体与为表创建的实体没有什么不同 但是 当 Hibernate 设置为验证模型时 我的应用程序将不会部署 因为它找不到视图 因为它假设它是一个表 是否可以在启用部署
  • 是一对一的关系不好的策略

    用户始终拥有一个钱包 一个钱包始终属于一位用户 由于我想分离与钱夹相关的属性 我创建了 Wallet 对象并能够跟踪钱交易 我创建了 public Wallet Entity
  • 在 AppEngine 项目之外使用 Google AppEngine 数据存储区

    对于我的小框架Pyxer http code google com p pyxer 我希望能够在 AppEngine 项目之外使用 Google AppEngine 数据存储 因为我现在已经习惯了这种 ORM 模式 对于一些快速的黑客来说
  • CQRS - 何时发送确认消息?

    Example 业务规则规定 客户下订单后应收到确认消息 电子邮件或类似消息 可以说 一个NewOrderRegisteredEvent从域调度并由发送确认消息的事件侦听器拾取 完成此操作后 其他一些事件处理程序会引发异常或出现其他问题 并
  • Symfony2 FosUserBundle 和 SonataUserBundle:覆盖实体?

    我将 FosUserBundle 和 SonataUserBundle 用于我的 Symfony2 项目 我现在很困惑 我想为实体用户添加字段 但它不起作用 例如 架构没有更新 这是我的配置 AppKernel new FOS UserBu
  • SugarORM 错误或缺少数据库

    我尝试让 Android 项目与 SugarORM 一起使用 但是 我遇到了以下错误 引起原因 android database sqlite SQLiteException 没有这样的表 DOCUMENT 代码1 编译时 INSERT O
  • 如何在 Hibernate 中使用 Oracle 查询提示

    我试图在 Hibernate 中使用 Oracle 提示来调用强制索引 但在 Hibernate 3 6 10 Final 中没有找到任何合适的 API 我以某种方式尝试了 Hibernate 标准中的预测 proList add Proj
  • 在 Django 中使用 prefetch_lated 连接 ManyToMany 字段

    我可能遗漏了一些明显的东西 但我在连接 ManyToMany 字段以在 Django 应用程序中工作时遇到问题 我有两个模型 class Area models Model name CharField class Role models
  • Eloquent/Laravel 三路多对多关系

    我对 Laravel 和 Eloquent 是全新的 而且我对 ORM 的经验也很少 假设我有三个数据库表 Widgets Actions Users 我建模了一个连接表 其中包含以下列 widget id action id user i
  • 学说“没有命名的协会”

    将我添加到无法找出其学说映射出了什么问题的人列表中 我正在模拟国际象棋Game与一对多Halfmoves 有任何想法吗 DDL create table game game id int primary key create table h

随机推荐

  • 获取给定标题的 mediawiki 页面的 URL - 以 PHP 编程方式 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 如何获取
  • 自定义 HTTP 方法在 Retrofit 2 中不起作用

    您好 我在代码中使用了自定义方法 如下所示 但它总是给我 java lang IllegalArgumentException 方法 AUTH 不得有 请求正文 我的代码无法正常工作 它总是说 Custom method AUTH must
  • 插入 MySQL 数据库的 PHP PDO 代码不起作用[重复]

    这个问题在这里已经有答案了 我在对一些简单的 PHP 代码进行故障排除以在 MySQL 表中插入记录时遇到困难 直接输入 WAMP 的代码可以正常工作 INSERT INTO users userName userEmail VALUES
  • 安装最新版本后显示较旧的 Ruby 版本

    我正在按照以下说明进行操作GoRails https gorails com setup osx 10 10 yosemite ruby在我的系统上安装 Ruby Rails 按照使用 rbenv 安装 Ruby 的说明进行操作后 我验证了
  • 填充线条曲线下

    对于下面的示例数据集 我想将 y 绘制为一条平滑线 并使用 R 在线下填充 我能够获得平滑的线条 但不能获得颜色填充的曲线 有人可以帮我吗 date y 2015 03 11 71 12 2015 03 10 34 0 2015 03 09
  • 如何替换 html 标签之间的任何文本

    我在 html 标签之间有文本 例如 td vip td 我将在标签之间添加任何文本 td td 我如何从这些标签中剪切任何文本并将任何文本放在这些标签之间 我需要通过 bash shell 来完成 我怎样才能做到这一点 首先 我尝试获取此
  • HttpClient - Xamarin Android - MvvmCross

    我一直在使用 Xamarin 和 MvvmCross 开发 Android 应用程序 一切都很顺利 我和我 的团队能够开发解决方案 本周我们决定进行最终调整并在其他环境中测试该应用程序 在测试过程中 我遇到了 Android 解决方案的巨大
  • 当我在 JScrollPane 中滚动水平和垂直滚动条时,paintComponent 不会被调用

    我在使用 Swing 和 JScrollPane 时遇到问题 我的行为很奇怪 我延长了JScrollPane 我在其中显示图像并在其上绘制矩形以定义区域 对于大图像 我有一个水平和一个垂直滚动条 我 好吧 当我移动一个或另一个滚动条时 我看
  • 重用 CloudFormation 标签列表

    我有一组相当复杂的 CloudFormation 模板 用于配置基础设施的不同环境 然而 我最近收到了使用相当广泛的标签列表 如 15 个 来标记创建的资源的请求 对我来说 将标签硬编码到每个模板文件中似乎不是一个好主意 我宁愿创建一次标签
  • arp -a 和路由打印

    我需要编写一个程序来显示这些信息 netstat TCP UDP 连接 有关 IP 的信息 ipconfig all arp a 路线打印 我已经拥有其中的大部分 但我有一个问题route print and arp a 我不想使用执行此命
  • 从 dll 导入显式实例化的模板类

    作为一个 dll 新手 我必须向全能的 SO 询问一些事情 假设我显式实例化一个模板类 如下所示 template class declspec dllexport B
  • 新的 C++ 向后兼容

    我已经很多年没有用 C 编写代码了 我最近发现 在那些年里 情况发生了很大的变化 我不确定我是否喜欢这些变化 但那是另一个讨论了 我的硬盘上仍然有一些 C 代码 如果我把它拿出来并尝试用一个很好的新 C 编译器 比如最新版本的 g 来编译它
  • 删除 Iframe 周围的额外空白?

    我在页面中使用 iframe 并偶然发现了一个奇怪的问题 我像这样设置 iframe css iframe margin none padding none background blue this is just to make the
  • 尝试在fineUploader中解析xhr响应文本时出错

    我现在购买了这个罚款上传器版本 3 3 0 并将所有库集成到我的网站中 我认为上传可以正常工作 但不行 我的 javascript 控制台出现错误 FineUploader Sending upload request for 0 Fine
  • 角度材质选项卡 - 仅在选择活动选项卡时加载/卸载组件

    给出 MainComponent html 的以下代码
  • 将数字转换为逗号分隔值

    我需要将数字转换为逗号分隔的格式以显示在C 例如 1000 to 1 000 45000 to 45 000 150000 to 1 50 000 21545000 to 2 15 45 000 如何实现这一目标C 我尝试了下面的代码 in
  • 在 Ubuntu 上使用 mysql 安装 Sonar

    我正在尝试让本机声纳包在 ubuntu 12 04 上运行 当我使用 H2 运行它时 它正在端口 9000 上运行并可访问 如果我切换到 mysql 它不工作 看起来数据库连接失败 登录名 表和权限都会经过多次双重检查 当我尝试访问 htt
  • Chrome RangeError:使用 jQuery $.map 时超出最大调用堆栈大小

    我正在为我的雇主测试一个 Web 应用程序 其中涉及从服务器检索大量数据 使用以下方法将数据作为 JSON 对象返回 ajax http api jquery com jQuery ajax 函数 包含大量子对象 我使用 jQuery 将其
  • 如果我没有为其相应的命令声明消息映射条目,如何阻止 MFC 禁用我的控件?

    我有以下问题 如果我没有相应消息的消息映射条目 假设 ID MYBUTTON1 MFC 将禁用我的工具栏 CToolbar 控件 有没有解决的办法 我对菜单也有同样的问题 但我发现您可以通过将 CFrameWnd m bAutoMenuEn
  • DDD - 使用 Doctrine 2 的有界上下文之间的关联映射

    我正在努力理解使用 Doctrine 2 实现来自不同有界上下文的两个实体之间的关联映射的正确方法 假设有两个 User 和 Post 实体分别属于 User 和 Content 有界上下文 内容 上下文中还有一个 用户 概念 它通过多对一