Bug #3859

Reference cycles can not be persisted if no aggregate roots are involved

Added by Karsten Dambekalns about 6 years ago. Updated about 4 years ago.

Status:Resolved Start date:2009-07-09
Priority:Must have Due date:
Assigned To:Karsten Dambekalns % Done:

100%

Category:FLOW3 Persistence
Target version:-

Description

When having reference cycles in an object tree that is persisted, the Backend bails out if the objects are not aggregate root (i.e. don't have a repository):

Uncaught FLOW3 Exception
#1219424096: The identifier requested (7e449a8f-94cb-41bc-ad1f-927fb4ca0643) for "flow3:contentNode"is already in use. (More information)

F3\PHPCR\ItemExistsException thrown in file
/Users/Shared/Sites/dev/flow3/dist/Packages/Global/TYPO3CR/Classes/Node.php in line 465.

9 F3\TYPO3CR\Node::addNode("flow3:contentNode", "flow3:F3_TYPO3_Domain_Model_Structure_ContentNode", "7e449a8f-94cb-41bc-ad1f-927fb4ca0643")

/Users/Shared/Sites/dev/flow3/dist/Packages/Global/TYPO3CR/Classes/FLOW3/Persistence/Backend.php:
00478:    $node = $parentNode->addNode($nodeName, $nodeTypeName, $object->FLOW3_AOP_Proxy_getProperty($uuidPropertyName));
00479:   } elseif ($object->FLOW3_AOP_Proxy_getProperty('FLOW3_Persistence_Entity_UUID') !== NULL) {
00480:    $node = $parentNode->addNode($nodeName, $nodeTypeName, $object->FLOW3_AOP_Proxy_getProperty('FLOW3_Persistence_Entity_UUID'));
00481:   } else {
00482:    $node = $parentNode->addNode($nodeName, $nodeTypeName);

8 F3\TYPO3CR\FLOW3\Persistence\Backend::createNodeForEntity(F3\TYPO3\Domain\Model\Structure\ContentNode_AOPProxy_Development, F3\TYPO3CR\Node, "flow3:contentNode")

/Users/Shared/Sites/dev/flow3/dist/Packages/Global/TYPO3CR/Classes/FLOW3/Persistence/Backend.php:
00393:      if ($object->FLOW3_Persistence_isNew()) {
00394:       if ($this->classSchemata[$propertyValue->FLOW3_AOP_Proxy_getProxyTargetClassName()]->getModelType() === \F3\FLOW3\Persistence\ClassSchema::MODELTYPE_ENTITY) {
00395:        $this->createNodeForEntity($propertyValue, $node, 'flow3:' . $propertyName);
00396:       } else {
00397:        $this->createNodeForValueObject($propertyValue, $node, 'flow3:' . $propertyName);

7 F3\TYPO3CR\FLOW3\Persistence\Backend::persistObject(F3\TYPO3\Domain\Model\Content\Page_AOPProxy_Development)

/Users/Shared/Sites/dev/flow3/dist/Packages/Global/TYPO3CR/Classes/FLOW3/Persistence/Backend.php:
00414:    // right place and have the right name. fancy, eh?
00415:   foreach ($queue as $object) {
00416:    $this->persistObject($object);
00417:   }
00418:  }

6 F3\TYPO3CR\FLOW3\Persistence\Backend::persistObject(F3\TYPO3\Domain\Model\Structure\ContentNode_AOPProxy_Development)

/Users/Shared/Sites/dev/flow3/dist/Packages/Global/TYPO3CR/Classes/FLOW3/Persistence/Backend.php:
00414:    // right place and have the right name. fancy, eh?
00415:   foreach ($queue as $object) {
00416:    $this->persistObject($object);
00417:   }
00418:  }

5 F3\TYPO3CR\FLOW3\Persistence\Backend::persistObject(F3\TYPO3\Domain\Model\Structure\Site_AOPProxy_Development)

/Users/Shared/Sites/dev/flow3/dist/Packages/Global/TYPO3CR/Classes/FLOW3/Persistence/Backend.php:
00329: 
00330:   foreach ($this->aggregateRootObjects as $object) {
00331:    $this->persistObject($object);
00332:   }
00333: 

4 F3\TYPO3CR\FLOW3\Persistence\Backend::persistObjects()

/Users/Shared/Sites/dev/flow3/dist/Packages/Global/TYPO3CR/Classes/FLOW3/Persistence/Backend.php:
00249:   */
00250:  public function commit() {
00251:   $this->persistObjects();
00252:   $this->processDeletedObjects();
00253:   $this->session->save();

3 F3\TYPO3CR\FLOW3\Persistence\Backend::commit()

/Users/Shared/Sites/dev/flow3/dist/Packages/Global/FLOW3/Classes/Persistence/Manager.php:
00209:   $this->backend->setAggregateRootObjects($aggregateRootObjects);
00210:   $this->backend->setDeletedObjects($removedObjects);
00211:   $this->backend->commit();
00212: 
00213:    // this needs to unregister more than just those, as at least some of

2 F3\FLOW3\Persistence\Manager::persistAll()

/Users/Shared/Sites/dev/flow3/dist/Packages/Global/FLOW3/Classes/Core/Bootstrap.php:
00652: 
00653:    if ($this->settings['persistence']['enable'] === TRUE) {
00654:     $this->objectManager->getObject('F3\FLOW3\Persistence\ManagerInterface')->persistAll();
00655:    }
00656:    $this->objectManager->getObject('F3\FLOW3\Session\SessionInterface')->close();

1 F3\FLOW3\Core\Bootstrap::run()

/Users/Shared/Sites/dev/t3v5/dist/Public/index.php:
00045: $flow3 = new $bootstrapClassName(getenv('FLOW3_CONTEXT'));
00046: $flow3->initialize();
00047: $flow3->run();
00048: 
00049: ?>

Instead of producing that exception, an object proxy should be created in the CR.

Associated revisions

Revision 53b3b389
Added by Karsten Dambekalns about 6 years ago

[+BUGFIX] TYPO3CR (FLOW3 Persistence): Cyclic object references can now be stored even if the involved objects are not aggregate roots, fixes #3859.

History

#1 Updated by Karsten Dambekalns about 6 years ago

  • Status changed from Accepted to Resolved
  • % Done changed from 0 to 100

Applied in changeset r2779.

#2 Updated by Robert Lemke about 4 years ago

  • Target version deleted (0.5.0 alpha 3)

Also available in: Atom PDF