2016-05-11 2 views
0

Я делаю заявку в Symfony2 и используя комплект doctrine mongodb odm. Я создал документ с идентификатором, который не имеет стратегии = NONE, как (только сниппета):Предотвратите повышение, когда указан идентификатор mongodb odm

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 

/** 
* @MongoDB\Id(strategy="NONE") 
* @var string 
*/ 
private $id; 

Позже при вставке, каждый раз, когда я указать идентификатор перед вызовом сохраняются, после проверки журналов я считаю, что upsert был сделан вместо batchInsert. После некоторого поиска в Google я столкнулся с this link, который подтвердил мне, что это на самом деле случай по дизайну.

Поэтому мой вопрос: как избежать ошибки после того, как я укажу идентификатор объекта?

Пс: Мне нужно это, потому что с обновлением doctrine mongodb odm будет обновляться, если он найдет идентификатор уже там, но я хочу, чтобы он увидел такой дубликат и бросил MongoDuplicateKeyException.

ответ

0

Как вы заметили ODM будет upsert новый документ, если его идентификатор устанавливается во время начальной сохраняется (или идентификатор генерируется во время prePersist события), here вы можете увидеть соответствующий код в UnitOfWork. Чтобы документ был вставлен, вам необходимо изменить стратегию ID вашего документа на CUSTOM и использовать свой собственный генератор, вы можете найти некоторую информацию об этом до конца this docs chapter.

+0

Спасибо за ваш ответ; определенно чувствует, как направление, которое я должен предпринять. Моя единственная проблема заключается в том, что я не могу понять, как (в моем генераторе идентификаторов, который расширяет «Doctrine \ ODM \ MongoDB \ Id \ AbstractIdGenerator'), чтобы использовать' $ param' в 'setId ($ param) 'call, в моем конечном id. – anka

+0

Я не уверен, что вы называете '$ param'? Вообще говоря, вашему генератору необходимо вернуть идентификатор, ODM позже установит его в документе. – malarzm

+0

Еще раз спасибо [malarzm] (http://stackoverflow.com/users/5982920/malarzm) за помощь. Под '$ param' я подразумеваю значение, которое я намереваюсь установить как идентификатор' $ object', прежде чем передать его на сохранение, например 'persist ($ object)'. Вызов setId будет похож на '$ object-> setId ($ param)', где-то после создания экземпляра '$ object', но перед' persist ($ object) '. Есть ли способ получить доступ к этому значению ('$ param') внутри генератора? – anka

Смежные вопросы