Skip to content

Commit 0b7089f

Browse files
committed
Take snapshot prior then compare after update events.
1 parent cebdaf0 commit 0b7089f

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.groovy

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,26 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister<Object> {
240240
mongoCodecSession.addPendingUpdate(new PendingUpdateAdapter(entity, id, obj, entityAccess) {
241241
@Override
242242
void run() {
243+
// Take snapshot of all property values BEFORE the PreUpdate event fires
244+
Map<String, Object> beforeUpdateSnapshot = [:]
245+
if (obj instanceof DirtyCheckable) {
246+
for (PersistentProperty prop : entity.persistentProperties) {
247+
beforeUpdateSnapshot[prop.name] = entityAccess.getProperty(prop.name)
248+
}
249+
}
243250
if (!cancelUpdate(entity, entityAccess)) {
251+
// Compare with snapshot and mark modified properties dirty
252+
if (obj instanceof DirtyCheckable) {
253+
DirtyCheckable dirtyCheckable = (DirtyCheckable) obj
254+
for (PersistentProperty prop : entity.persistentProperties) {
255+
Object oldValue = beforeUpdateSnapshot[prop.name]
256+
Object newValue = entityAccess.getProperty(prop.name)
257+
boolean valueChanged = oldValue != newValue && (oldValue == null || !oldValue.equals(newValue))
258+
if (valueChanged) {
259+
dirtyCheckable.markDirty(prop.name, newValue, oldValue)
260+
}
261+
}
262+
}
244263
updateCaches(entity, obj, id)
245264
addCascadeOperation(new PendingOperationAdapter(entity, id, obj) {
246265
@Override

0 commit comments

Comments
 (0)