使用LazyObjectStorages持久化对象



我目前正在TYPO3 7/Extbase中实现一个web应用程序,该应用程序具有由根对象和子对象树组成的复杂对象结构。

假设它类似于一个更复杂的版本:

对象A&lt--1:n-->对象B&lt--1:n-->对象C

由于对象a的实例是聚合根,所以我使用object-a-Repository来持久化树。

这效果很好,但出于性能原因,我将许多关系切换到了懒惰加载(使它们的对象变得懒惰)。这大大加快了应用程序的速度,但并不是所有对Object-A-Repository的update()调用都能正常工作。当方法接收到C类型的对象,对其进行更改并需要持久化更改时,就会出现此问题。C有到其父B的父链接,而B有到a(惰性对象存储的对应对象)的父链接。

这个问题似乎与LazyObjectStorages没有用实际内容替换自己有关(因为在这种情况下,A对象没有使用它的"侧"关系)。如果在更新对象之前对其调用DebuggerUtility::var_dump(),那么持久性就可以完美地工作。如果我不这样做,数据库不会更改。

有没有办法强制一个对象加载它所有的惰性存储?或者我应该用另一种方式来解决这个问题?

如果一个操作只更改对象C,为什么不为该模型使用单独的Repository?您可以很容易地在extbase中提供一个存储库。

在这种情况下,我看不出有什么不好的做法或问题。默认情况下,typeo3只会将关系数持久化到objects_c的数据库字段中,因此如果添加或删除对象,则只需要通过聚合根持久化更改。使用ObjectC的子存储库进行简单的更新会非常好。

如果您确实需要通过聚合根执行此操作,则应确保不再存在LazyObjectStorage。

通过调用具体对象的一个函数,LazyObjectStorage将与真正的ObjectStorage交换其父属性(因此是指向自身的指针)。

例如

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

将$objectA中的属性objectsB设置为ObjectStorage(具有所有关系)。

当然,像$objectA->getObjectsB()->toArray()这样的其他方法也会起作用。

最新更新