Many times we use entity.refresh(REFRESH_FORGET_NEW_ROWS | REFRESH_UNDO_CHANGES)
to prevent any changes we made to that entity from getting committed to the DB. What the refresh()
method effectively does is change the post state of the entity. (See difference between entity-state and post-state.) The post-state is later used to decided which DML operation to use for the entity, i.e. DML_DELETE
, DML_INSERT
or DML_UPDATE
(ref).
I recently came across a code which called refresh()
from the entity’s prepareForDML()
but that had no effect. ADF documentation says nothing about such a behaviour. I read the EntityImpl
code and got my answer there. When we are saving data to DB the call chain is like – transaction.postChanges() -> entity.postChanges() -> entity.prepareForDML() -> entity.doDML()
.
prepareForDML()
and doDML()
have first argument operation
; this is the DML operation to undertake. The code to decide which DML operation to perform based on entity’s post-state is in EntityImpl.postChanges()
. That method invokes prepareForDML()
method with the DML operation to undertake. Changing post-state from prepareForDML()
or doDML()
is useless. So, post-state needs to be set no later than postChanges()
. However, if you do need to do this from prepareForDML()
or doDML()
then you could modify the operation
param’s value appropriately.