我有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
。
我正在寻找一种优雅的方式来实现目标: