自2周以来,我们在尝试刷新新元素时遇到了这个问题:
CRITICAL:Doctrine \ ORM \ ORMInvalidArgumentException:
通过“Comment#capture”关系找到了一个新实体,该关系未配置为级联实体的持久化操作
但是capture
已经存在于数据库中,我们正在通过findOneBy
得到它,所以如果我们级联持久化,或者持续存在,我们就会得到一个
表约束违规:重复条目。
注释是在带有不同捕获的循环中创建的,并且设置了新的和所有必需字段。
如果所有实体都持久化和/或由findOne
获得(并且全部有效),则刷新仍然失败。
我已经有一段时间了,所以请帮帮我
答案 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();
时,我会收到此错误,因为下一批实体将指向已分离的相关实体。
什么错误:
我不知道$this->entityManager->clear();
与$this->entityManager->detach($entity);
的工作方式相同,只是将所有存储库的实体分开。
我认为$this->entityManager->clear();
也会分离相关实体。
我应该做什么:
我应该迭代实体并逐个分离它们 - 这样就不会分离未来实体所指向的相关实体。
我希望这有助于某人。
答案 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);
}
}