private function __saveAssociationById(PersistentObject $object, AssociationMap $associationMap, &$commands, ClassMap $classMap, $id) { $toAttributeMap = $associationMap->getToAttributeMap(); $fromAttributeMap = $associationMap->getFromAttributeMap(); $refObject = $associationMap->getToClassMap()->getObject(); if ($associationMap->getCardinality() == 'oneToOne') { // obtem o objeto referenciado if ($refObject != NULL) { // se a associação é inversa, atualiza o objeto referenciado if ($associationMap->isInverse()) { $refObject->getById($id); $refObject->setAttributeValue($toAttributeMap, $object->getAttributeValue($fromAttributeMap)); $this->_saveObject($refObject, $associationMap->getToClassMap(), $commands); } else { // se a associação é direta, atualiza o próprio objeto $object->setAttributeValue($fromAttributeMap, $id); $this->_saveObject($object, $classMap, $commands); } } } elseif ($associationMap->getCardinality() == 'oneToMany') { // atualiza os objetos referenciados $commands[] = $associationMap->getUpdateStatementId($object, $id, $object->getAttributeValue($fromAttributeMap)); } elseif ($associationMap->getCardinality() == 'manyToMany') { $commands = array(); // atualiza a tabela associativa (removendo e reinserindo os registros de associação) $aId = $id; if (!is_array($id)) { $aId = array($id); } if ($object->getId()) { //$commands[] = $associationMap->getDeleteStatement($object); $commands[] = $associationMap->getDeleteStatementId($object, $aId); } foreach ($aId as $idRef) { $commands[] = $associationMap->getInsertStatementId($object, $idRef); } //$commands[] = $associationMap->getInsertStatementId($object, $id); } }