我正在將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