[DDC-2406] Merging of new detached entities with PrePersist lifecycle callback breaks Created: 19/Apr/13 Updated: 30/May/14
|Project:||Doctrine 2 - ORM|
|Reporter:||Oleg Namaka||Assignee:||Benjamin Eberlei|
Merging of new detached entities with PrePersist lifecycle callback breaks:
The reason it happens is that the merge operation is trying to persist a new entity created by uow::newInstance($class) without populating its properties first:
This should happen first for the $managedCopy:
|Comment by Fabio B. Silva [ 28/Apr/13 ]|
Benjamin Eberlei, Is this an expected behavior ?
I mean.. This issue is about dispatch the event before copy the original values into the managed instance.
|Comment by Benjamin Eberlei [ 01/May/13 ]|
Fabio B. Silva he talks about $em->merge() on a detached entity calling pre persist. This should only happen on a NEW entity, not on a DETACHED one.
|Comment by Oleg Namaka [ 01/May/13 ]|
I tend to disagree with the statement above about pre persist that should not happen on a detached entity being merged back in. If this event handler contains a business logic that this entity needs to be checked against and the detached entity was modified before the merge operation in a way that invalidates it in the prePersist than I will end up with the invalid entity in the identity map. If the merge operation calls persist it must run the prePersist event handler as well for consistency.
If there is a logic that prevents persisting invalid entities why should it bypassed in the merge operation?
|Comment by Cory Close [ 28/Nov/13 ]|
I can confirm that this bug has not been fixed while using doctrine 2.4
Exactly as Oleg Namaka has described, my organization is trying to use @PrePersist callbacks to enforce validation on new entities.
However, we use an extensive client side framework that sends json back to our server. Our workflow is then:
deserializeJson into detached entity
However, some entities run into the above problem while using this workflow, so our validation is not run. I can provide more code samples if required.
|Comment by Oleg Namaka [ 29/Apr/14 ]|
Whose feedback is it awaiting for?
|Comment by Romaric Drigon [ 30/May/14 ]|
I can confirm this issue.
My use case (which I guess is pretty standard):
PrePersist is called on an entity with all properties set to null. Any modifications made inside this entity won't be saved to the DB.
|Comment by Cory Close [ 30/May/14 ]|
Is there any reason the proposed solution can't be implemented? I've patched a local version of Doctrine with the proposed changes and ran it through my application's tests without any issues, so I believe this would fix the problem.