我正在将ZF3应用程序的DBAL迁移到Doctrine,并且希望一步一步地继续。目前我正在使用Mapper
对象的层次结构。像FooEntity
层次结构中的每个实体都有一个根据FooMapper
。嵌套实体的保存通过嵌套Mapper
来执行。每个Mappers
将其实体保存为Zend\Db\Sql\Insert
或Zend\Db\Sql\Update
,并为子实体调用适当的Mapper
,如BarMapper
的BarEntity
。现在如何仅使用Doctrine执行实体层次的第一级?
,之前我主义的便捷功能开始喜欢cascade={"persist"}
,我想保持Mapper
的层次结构,只是为了persist(...)
& flush()
进行嵌套实体的最高级别的节能。
但是当我尝试它
public function save(AbstractDataObject $dataObject)
{
$newLogicalConnection = $this->logicalConnectionMapper->save($dataObject->getLogicalConnection());
$newUser = $this->userMapper->save($dataObject->getUser());
$dataObject->setLogicalConnection($this->entityManager->find(LogicalConnection::class, $newLogicalConnection->getId()));
$dataObject->setUser($this->entityManager->find(User::class, $newUser->getId()));
$this->entityManager->persist($dataObject);
$this->entityManager->flush();
return $dataObject;
}
我得到一个错误
A new entity was found through the relationship 'MyNamespace\DataObject\AbstractEndpoint#externalServer' that was not configured to cascade persist operations for entity: MyNamespace\DataObject\[email protected] 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"}). If you cannot find out which entity causes the problem implement 'MyNamespace\DataObject\ExternalServer#__toString()' to get a clue.
所以,学说似乎试图拯救其子实体整个实体,并在一个尝试失败较低的水平。但为什么?我没有激活任何cascade
选项,并期望Doctrine只保存最高级别。
为什么学说试图保存整个实体而不仅仅是顶层?如何获得它只保存给定实体的顶层?
我不认为有办法。新的实体错误消息基本上是一个警告,您需要启用级联。鉴于您在两个对象之间存在关系,Doctrine将尝试坚持它。你当然可以删除关系映射。 – Cerad
@Cerad感谢您的评论。也许我理解'cascade = {“persist”}错误。我的期望是,对于'cascade = {“persist”}'注释,相关的对象被保存,没有 - 没有。但是,如果级联保存也没有'cascade = {“persist”}',那么这个注释是什么意思呢? – automatix
这又是一个警告。一些人喜欢明确坚持所有的儿童实体,在这种情况下不需要级联,警告消失。总的来说,关于ORM学说的一件事是,它只是以某种方式做事。你要么住在一起,要么不使用它。就个人而言,如果我已经有一个工作dbal的系统,那么我会坚持下去。 – Cerad