是否可以使用Value Object作为Doctrine ODM实体的id?

时间:2014-12-27 15:28:48

标签: php doctrine-odm ddd-repositories

我有Subscription实体,它代表了类似Twitter的模型中用户之间的多对多关系之一。它具有代理ID以确保关系的唯一性,它由值对象SubscriptionId表示。 SubscriptionId被保留为MongoBinData。这是XML描述:

<document name="Subscription"
          collection="users.subscriptions"
          repository-class="SubscriptionRepository">
    <field name="id" id="true" type="User.Subscription.Id"/>
    <field name="u" fieldName="userId" type="User.Id"/>
    <field name="t" fieldName="subscribedTo" type="User.Id"/>
    <field name="d" fieldName="dateTime" type="PreciseDateTime"/>
</document>

我在构造函数中手动将id字段设置为Subscription。问题是ODM强制upsert操作而不是插入具有ID的新实体。因此,我没有机会检测到重复(域事件将被提升两次,等等)。此代码无异常执行:

$sub = new Subscription($subscriberId, $subscribedToId);

$dm->persist($sub);
$dm->flush();

$dm->clear();

$dm->persist($sub);
$dm->flush();

我尝试使用自定义ID生成器,而不是在构造函数中设置id。但由于某些原因,ODM忽略了我的type="User.Subscription.Id"并将ID类型视为custom_id。我的实体的实例为MongoBinData而不是所需的SubscriptionId

我正在寻找一种优雅的方式来实现目标:

  1. VO as entity's id
  2. 持久保存具有现有ID的新实体
  3. 时的重复异常

0 个答案:

没有答案