学说 - 通过这种关系找到了一个新的实体

时间:2013-08-13 17:56:41

标签: symfony doctrine

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

  

CRITICAL:Doctrine \ ORM \ ORMInvalidArgumentException:

     

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

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

  

表约束违规:重复条目。

注释是在带有不同捕获的循环中创建的,并且设置了新的和所有必需字段。

如果所有实体都持久化和/或由findOne获得(并且全部有效),则刷新仍然失败。

我已经有一段时间了,所以请帮帮我

7 个答案:

答案 0 :(得分:51)

我有同样的问题,它是相同的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();

答案 1 :(得分:39)

在我的情况下,过早调用

$this->entityManager->clear();

导致了这个问题。它只是通过对最近的对象做一个明确的消失而消失,比如

$this->entityManager->clear($capture);

答案 2 :(得分:27)

我的回答与主题相关,但与您的具体情况无关,所以对于那些谷歌搜索我发布此内容,因为上述答案对我没有帮助。

在我的情况下,我对具有关系的批处理实体有同样的错误,并且该关系设置为完全相同的实体。

我错的是什么:

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

什么错误:

  1. 我不知道$this->entityManager->clear();$this->entityManager->detach($entity);的工作方式相同,只是将所有存储库的实体分开。

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

  3. 我应该做什么:

    我应该迭代实体并逐个分离它们 - 这样就不会分离未来实体所指向的相关实体。

    我希望这有助于某人。

答案 3 :(得分:9)

首先,你应该更好地照顾你的代码,我看到你的实体和控制器中有3个不同的缩进 - 这很难阅读,并且不适合Symfony2 coding standards

您的控制器的代码you show不完整,我们不知道$this->activeCapture即将来临。在里面你有$people['capture'],其中包含我认为的Capture个对象。这非常重要。

如果$people['capture']中的Capture从另一个EntityManager持久保存/获取而不是$this->entityManager(同样,我们不知道它来自何处),Doctrine2不知道该对象已经存在

您应该确保对所有这些操作使用相同的Doctrine Entity Manager实例(在EM对象上使用spl_object_hash以确保它们是同一个实例)。

您还可以告诉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);

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

答案 4 :(得分:6)

错误:     '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;

答案 5 :(得分:2)

刷新问题实体有助于解决我的问题。

/* $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的单个实例来解决该问题。

答案 6 :(得分:0)

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

yarn.scheduler.minimum-allocation-mb = 1024
yarn.scheduler.maximum-allocation-mb = 8192
yarn.scheduler.minimum-allocation-vcores = 1
yarn.scheduler.maximum-allocation-vcores = 32
yarn.nodemanager.resource.memory-mb = 8192
yarn.nodemanager.resource.cpu-vcores = 8

我的情况是我试图保存不应保存的实体。实体关系已填充并尝试保存(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中有User,但Chat是一个临时实体),但存在一些冲突。

因此,如果我使用Chat我会收到不需要的行为 - 垃圾实体会被保存。我的解决方案是从任何保存实体中删除非保存实体:

cascade={"persist"}

保存代码

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