88

自 2 周以来,我们在尝试刷新新元素时遇到了这个问题:

关键:教义\ORM\ORMInvalidArgumentException:

通过关系“Comment#capture”找到了一个新实体,该关系未配置为对实体进行级联持久化操作

但是capture已经在数据库中了,我们通过 a 得到它findOneBy,所以如果我们级联持久化它,或者持久化它,我们得到一个

违反表约束:重复条目。

评论是在一个循环中创建的,带有不同的捕获,带有一个新的,并且所有必填字段都已设置。

由于所有实体都被保留和/或获得findOne(并且都是有效的),刷新仍然失败。

我在这个问题上已经有一段时间了,所以请帮助我

4

7 回答 7

61

我有同样的问题,它是一样的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();
于 2013-12-11T11:10:30.367 回答
48

在我的情况下,一个为时过早的电话

$this->entityManager->clear();

导致问题。它也通过仅对最近的对象进行清除而消失,例如

$this->entityManager->clear($capture);
于 2013-09-17T13:32:28.743 回答
46

我的回答与主题相关,但与您的特定情况不太相关,所以对于那些在谷歌上搜索的人,我发布了这个,因为上面的答案对我没有帮助。

在我的例子中,我对具有关系的批处理实体有同样的错误,并且该关系被设置为同一个实体。

我做错了什么:

当我$this->entityManager->clear();在处理一批实体时这样做时,我会收到此错误,因为下一批实体将指向分离的相关实体。

什么地方出了错:

  1. 我不知道这与仅分离所有存储库实体的$this->entityManager->clear();工作方式相同。$this->entityManager->detach($entity);

  2. 我认为这$this->entityManager->clear();也会分离相关实体。

我应该做的:

我应该迭代实体并将它们一一分离——这不会分离未来实体指向的相关实体。

我希望这可以帮助别人。

于 2016-02-22T14:40:32.880 回答
11

首先,您应该更好地照顾您的代码,我看到您的实体和控制器中有 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);

如果这没有帮助,您应该提供更多代码。

于 2013-08-14T09:42:21.220 回答
9

错误:“Comment#capture”未配置为级联实体的持久操作

问题:

/**
 * @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;
于 2013-08-15T10:38:07.720 回答
8

刷新有问题的实体有助于我的情况。

/* $item->getProduct() is already set */

/* Add these 3 lines anyway */
$id = $item->getProduct()->getId();            
$reference = $this->getDoctrine()->getReference(Product::class, $id);
$item->setProduct($reference);

/* Original code as follows */
$quote->getItems()->add($item);
$this->getDoctrine()->persist($quote);
$this->getDoctrine()->flush();

尽管我$item已经在Product其他地方有一套,但我仍然收到错误消息。

原来它是通过不同的实例设置的EntityManager

所以这是一种黑客攻击,通过检索id现有产品,然后检索它的引用,并使用setProduct“刷新”任何连接。EntityManager后来我通过确保在我的代码库中只有一个实例来修复它。

于 2018-12-26T21:20:45.157 回答
0

尝试添加新实体时,我也收到此错误。

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"}).

我的情况是我试图保存不应该保存的实体。实体关系已填充并试图保存(在 Many2Many 中UserChat,但 Chat 是一个临时实体),但发生了一些冲突。

所以如果我使用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();
于 2015-05-05T07:44:58.930 回答