mirror of
https://github.com/doctrine/orm.git
synced 2026-03-23 22:42:18 +01:00
DDC-518: Merging an entity with a one to one association to a MANAGED entity with no id throws 'The given entity has no identity.' #645
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @doctrinebot on GitHub (Apr 13, 2010).
Jira issue originally created by user ccapndave:
Calling merge($entity) where $entity has a one to one association to another entity that has been persisted but not yet flushed (when using auto-generated ids) throws 'The given entity has no identity.'
It looks like it does this because _doMerge in UnitOfWork assumes for one to one associations only that the associated entity has an id and calls registerManaged, which then calls addToIdentityMap)on it.
I think that registeredManaged should only be called if !isset($this->_entityInsertions[spl_object_hash($other)])
@doctrinebot commented on GitHub (May 8, 2010):
Comment created by romanb:
I think the order of operations in your example is not correct even though the error is misleading.
You are associating a "new doctor" to a "detached patient". That does not seem right, remember that merge() returns a managed copy, thus when merging the patient later, the "new doctor" is still associated with the "detached patient", not with the managed one.
The following should work:
@doctrinebot commented on GitHub (May 16, 2010):
Comment created by ccapndave:
You are quite right - that does work.
However, I am now trying to implement my use case (turning a tree of detached objects into a tree of managed objects) and implementing the correct order you describe above seems to cause another problem. I am not sure if this should be another ticket, but I'll put it here for the moment.
Note that the part within the stars that creates the unmanaged doctor and the detached patient simulates exactly what is received by Doctrine in my application so I can't put any merges in here.
This works up to the flush, which throws an error of the form:
Notice: Undefined index: 000000007dd346c3000000005d0908d2 in \Doctrine\ORM\UnitOfWork.php on line 1955
In the database this results in a new doctor being created, but doctor_id in the patients table is set to NULL for the patient that is supposed to be linking to it.
@doctrinebot commented on GitHub (Jun 6, 2010):
Comment created by @beberlei:
I think this can't work, because obviously $doctor->patients still points to the unmanaged $patient, not the managed one.
Can you elaborate on why the star part is done by Doctrine? Where is doctrine doing that? what are you doing with the public API?
All the detached entities should be merged before doing anything regarding a NEW entity in my opinion.
@doctrinebot commented on GitHub (Jun 6, 2010):
Comment created by @beberlei:
Moved to beta3 for now
@doctrinebot commented on GitHub (Jun 6, 2010):
Comment created by @beberlei:
Patch with test-case for this merging scenario
@doctrinebot commented on GitHub (Jul 30, 2010):
Comment created by romanb:
Fixed in
69073c4b37@doctrinebot commented on GitHub (Jul 30, 2010):
Issue was closed with resolution "Fixed"
@doctrinebot commented on GitHub (Dec 13, 2015):
Imported 1 attachments from Jira into https://gist.github.com/f86063ebfb3c36dac12a