持久对象与LazyObjectStorages

问题描述:

我目前在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

如果一个动作只改变对象C,为什么不使用该模型的分离存储库?你可以很容易地在extbase中提供一个仓库。

在这种情况下,我没有看到任何不好的做法或问题。默认情况下,typo3只会将关系数保存到objects_c的数据库字段中,所以如果添加或删除对象,则只需通过聚合根持久化更改。使用ObjectC的子存储库进行简单更新可以很好地工作。

如果你真的需要通过聚合根来完成,你应该确保没有LazyObjectStorage了。

通过调用具体对象的一个​​函数,LazyObjectStorage将使用真实的ObjectStorage交换它的父项属性(所以指向它自己的指针)。

例如

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

将设置在$对象A属性objectsB为ObjectStorage(所有关系)。

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