2017-01-09 54 views
3

我目前在TYPO3 7/Extbase中實現了一個web應用程序,它具有一個複雜的對象結構,由一個根對象和一個子對象樹組成。持久對象與LazyObjectStorages

比方說,這就像一個更復雜的版本:

對象A < --1:N - >對象B < --1:N - >對象C

由於實例對象a是聚合根,我使用Object-A-Repository來保存樹。

這個效果很好,由於性能方面的原因,我把許多關係切換到了延遲加載,但是(使得它們的對象減少了)。這極大地加快了應用程序的運行速度,但並不是所有對Object-A-Repository的update()調用似乎都行得通。如果某個方法接收到C類型的對象並更改該對象並需要保留更改,則會出現該問題。 C具有到其父B的父鏈接,而B具有到A(懶惰對象存儲的對應部分)的父鏈接。

這個問題似乎與LazyObjectStorages沒有用實際的內容替換自己有關(因爲在這種情況下A對象沒有使用它的關係的「一側」)。如果在更新對象之前調用對象上的DebuggerUtility :: var_dump(),則持久性可以很好地工作。如果我不這樣做,數據庫不會改變。

有沒有辦法強制一個對象加載所有懶惰的存儲?或者我應該以另一種方式解決這個問題?

+0

爲什麼你需要堅持一個懶惰的存儲?它應該是定義沒有改變,不應該需要任何(新)堅持。 – pgampe

+0

比方說,我有一個控制器操作,它接收對象C的一個實例,對其進行更改,然後保留相應的A實例(因爲它是該對象的聚合根)。我有父母的鏈接到A,但A到B和B到C存儲似乎仍然很懶。 – mrwienh

+1

如果你做了'$ A-> getB-> setC($ C);'''''''''''''''''''''''''''' – pgampe

回答

0

如果一個動作只改變對象C,爲什麼不使用該模型的分離存儲庫?你可以很容易地在extbase中提供一個倉庫。

在這種情況下,我沒有看到任何不好的做法或問題。默認情況下,typo3只會將關係數保存到objects_c的數據庫字段中,所以如果添加或刪除對象,則只需通過聚合根持久化更改。使用ObjectC的子存儲庫進行簡單更新可以很好地工作。

如果你真的需要通過聚合根來完成,你應該確保沒有LazyObjectStorage了。

通過調用具體對象的一個​​函數,LazyObjectStorage將使用真實的ObjectStorage交換它的父項屬性(所以指向它自己的指針)。

例如

$objectA->getObjectsB()->current(); 

將設置在$對象A屬性objectsB爲ObjectStorage(所有關係)。

其他方法,如$objectA->getObjectsB()->toArray()當然也可以工作。