Доктрина - новая связь была найдена через отношения

41

с 2 недель, у нас возникает эта проблема, пытаясь смыть новые элементы:

CRITICAL: Doctrine\ORM\ORMInvalidArgumentException:

Новый объект был найден через связь "Комментарий # захвата", которая не была настроена на каскадное сохранение операций для объекта

Но capture уже находится в базе данных, и мы получаем его с помощью findOneBy, поэтому, если мы каскадом сохраняем его или сохраняем, мы получаем

Нарушение ограничения таблицы: дубликат записи.

Комментарии создаются в цикле с различными захватами, с новым и всем необходимым полем.

Когда все объекты сохраняются и/или получаются с помощью findOne (и все они действительны), флеш все еще не работает.

Я занимаюсь этим вопросом некоторое время, поэтому, пожалуйста, помогите мне

  • 3
    Покажите нам некоторый код, например, контроллер и сущности.
  • 0
    Это связанная проблема, может помочь вам: stackoverflow.com/questions/18171801/…
Показать ещё 3 комментария
Теги:
doctrine

6 ответов

34

У меня была та же проблема, и она была такой же EntityManager. Я хотел вставить объект, связанный с ManyToOne. И я не хочу cascade persist.

Пример:

$category = $em->find("Category", 10);

$product = new Product();
$product->setCategory($category)

$em->persist($product);
$em->flush();

Это вызывает для меня одно и то же исключение.

Итак, решение:

$category = $em->find("Category", 10);

$product = new Product();
$product->setCategory($category)

$em->merge($product);
$em->flush();
  • 6
    работает. Но почему?
  • 5
    Слияние заставляет Doctrine найти существующий продукт $ с тем же идентификатором (назовем его $ originalProduct) и объединить $ product с $ originalProduct. Обратите внимание, что это имеет побочный эффект, что все свойства $ product будут скопированы в $ originalProduct. Источник: doctrine-orm.readthedocs.org/en/latest/reference/… Семантика операции слияния, применяемой к объекту X, следующая: если X является отсоединенным объектом, состояние X копируется в пре существующий экземпляр управляемого объекта X 'с той же идентичностью.
Показать ещё 2 комментария
33

В моем случае слишком ранний вызов

$this->entityManager->clear();

вызвало эту проблему. Он также исчез только после того, как прояснил последний объект, например

$this->entityManager->clear($capture);
  • 0
    То же самое и здесь, но я не понимаю, почему clear() вызвал такое поведение?
15

Мой ответ относится к теме, но не очень уместен для вашего конкретного случая, поэтому для тех googling я публикую это, так как ответы выше не помогли мне.

В моем случае у меня была такая же ошибка с объектами пакетной обработки, у которых было отношение, и это отношение было установлено на ту же самую сущность.

ЧТО Я НЕИСПРАВНОСТЬ:

Когда я выполнял $this->entityManager->clear(); при обработке партии объектов, я получал бы эту ошибку, потому что следующая партия объектов указывала бы на отдельный связанный объект.

ЧТО НЕ ПОСЫЛО:

  • Я не знал, что $this->entityManager->clear(); работает так же, как $this->entityManager->detach($entity); только отделяет ВСЕ объекты репозитория.

  • Я думал, что $this->entityManager->clear(); также отделяет связанные объекты.

ЧТО Я ДОЛЖЕН СДЕЛАТЬ:

Я должен был повторить действия над сущностями и отделить их один за другим - это не приведет к отсоединению связанного объекта, на который указывают будущие сущности.

Я надеюсь, что это поможет кому-то.

  • 0
    Я бы никогда не нашел это сам, отличный ответ, спасибо!
  • 2
    @drakonli, вам не нужно перебирать каждую сущность для отсоединения, вы можете использовать $this->entityManager->clear('EntityName'); отделить только один вид сущностей. Может помочь, если отсоединяемые все одинакового типа и больше не нужны в EM
8

Прежде всего, вам следует лучше позаботиться о своем коде, я вижу, как 3 разных отступов в вашей сущности и контроллере - это трудно прочитать и не подходит для Symfony2 стандартов кодирования.

Код который вы показываете для своего контроллера, не является полным, мы понятия не имеем, откуда $this->activeCapture. Внутри есть $people['capture'], который содержит объект Capture, который я предполагаю. Это очень важно.

Если Capture in $people['capture'] сохраняется/извлекается из другого EntityManager, чем $this->entityManager (что, опять же, мы не знаем, откуда оно), Doctrine2 не знает, что объект уже сохраняется.

Вы должны использовать один и тот же экземпляр Doctrine Entity Manager для всех этих операций (используйте spl_object_hash для объекта EM, чтобы убедиться, что они являются одним и тем же экземпляром).

Вы также можете сообщить EntityManager, что делать с объектом Capture.

// Refreshes the persistent state of an entity from the database
$this->entityManager->refresh($captureEntity);

// Or
// Merges the state of a detached entity into the 
// persistence context of this EntityManager and returns the managed copy of the entity.
$captureEntity = $this->entityManager->merge($captureEntity);

Если это не помогает, вы должны предоставить больше кода.

  • 0
    Я попытался обновить все имеющиеся у меня объекты activeCapture, но ничего ... Я уверен, что у меня есть только один EntityManager, потому что я использую "get ('doctrine.orm.default_entity_manager')". $ This-> activeCapture указан здесь: pastebin.com/px0cyWs0, а getActiveCapture здесь: pastebin.com/D0LRW2TD.
  • 0
    Почему вы отключаете линию Captures 36 от pastebin.com/px0cyWs0 ? Если на захват ссылаются где-то, Doctrine больше ничего о нем не знает, а затем может выдать исключение, которое вы получили.
Показать ещё 4 комментария
3

Ошибка:    "Комментарий # захвата", который не был сконфигурирован для каскадной операции persist для объекта

Проблема:

/**
 * @ORM\ManyToOne(targetEntity="Capture", inversedBy="comments")
 * @ORM\JoinColumn(name="capture_id", referencedColumnName="id",nullable=true)
 */
 protected $capture;

Не настроен каскадный упор

попробуйте следующее:

/**
 * @ORM\ManyToOne(targetEntity="Capture", inversedBy="comments", cascade={"persist", "remove" })
 * @ORM\JoinColumn(name="capture_id", referencedColumnName="id",nullable=true)
 */
 protected $capture;
1

Я тоже получил эту ошибку при попытке добавить новый объект.

A new entity was found through the relationship 'Application\Entity\User#chats' 
that was not configured to cascade persist operations for entity: ###. 
To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or
configure cascade persist  this association in the mapping for example @ManyToOne(..,cascade={"persist"}).

В моем случае я пытался сохранить объект, который не должен быть сохранен. Соотношения сущностей были заполнены и пытались сохранить (User имеет Chat в Many2Many, но Чат был временной сущностью), но были некоторые столкновения.

Итак, если я использую cascade={"persist"}, я получаю нежелательное поведение - объект мусора сохраняется. Мое решение состояло в том, чтобы удалить не сохраняющий объект из любых сохраняющих объектов:

// User entity code
public function removeFromChats(Chat $c = null){
    if ($c and $this->chats->contains($c)) {
        $this->chats->removeElement($c);
    }
}

Сохранение кода

/* some code witch $chat entity */
$chat->addUser($user);

// saving
$user->removeFromChats($chat);
$this->getEntityManager()->persist($user);
$this->getEntityManager()->flush();
  • 0
    Эй, уже упомянул, что сущность есть в базе данных, поэтому ваш ответ не имеет никакого смысла в этом вопросе.
  • 0
    @Vivek Ну, я нашел эту страницу через Google как наиболее относящуюся к полученной мной ошибке, поэтому мне пришлось самому найти решение, и в конце концов я оставил ее здесь, чтобы помочь другим с такой же ошибкой. Прошу прощения, если это не удобно для вас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню