From ba397bbb0c383bb9be0d1174e3752b9db09c4ef5 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Thu, 1 Apr 2021 16:04:18 +1300 Subject: [PATCH] For experimental "transparent persistence" - Delete removes from PC early When delete bean executed with transparent persistence, this marks the bean as removed from the persistence context early. This avoids a "dirty" deleted bean from being seen as a "dirty" bean in the persistence context at flush() time. --- .../server/core/PersistRequestBean.java | 8 +++++++ .../server/persist/DefaultPersister.java | 1 + .../TestTransparentPersist.java | 23 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java index eb48fc2ef..c4d02cbf6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java @@ -887,6 +887,14 @@ public final class PersistRequestBean extends PersistRequest implements BeanP } } + /** + * Remove deleted beans from the persistence context early. + */ + public void removeFromPersistenceContext() { + idValue = beanDescriptor.getId(entityBean); + beanDescriptor.contextDeleted(transaction.getPersistenceContext(), idValue); + } + /** * Aggressive L1 and L2 cache cleanup for deletes. */ diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java index a7b21f0c8..005e85d95 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/DefaultPersister.java @@ -881,6 +881,7 @@ public final class DefaultPersister implements Persister { } int count = request.executeOrQueue(); + request.removeFromPersistenceContext(); if (request.isPersistCascade()) { deleteAssocOne(request); diff --git a/ebean-core/src/test/java/org/tests/transparentpersist/TestTransparentPersist.java b/ebean-core/src/test/java/org/tests/transparentpersist/TestTransparentPersist.java index 2922d20b2..be5d8329b 100644 --- a/ebean-core/src/test/java/org/tests/transparentpersist/TestTransparentPersist.java +++ b/ebean-core/src/test/java/org/tests/transparentpersist/TestTransparentPersist.java @@ -17,6 +17,29 @@ import static org.assertj.core.api.Assertions.assertThat; public class TestTransparentPersist extends BaseTestCase { + @Test + public void delete_expect_beanRemovedFromPersistenceContext() { + + EBasicVer b0 = new EBasicVer("simpleDelete"); + DB.save(b0); + + try (Transaction transaction = DB.beginTransaction()) { + transaction.setTransparentPersistence(true); // EXPERIMENTAL feature + + EBasicVer found = DB.find(EBasicVer.class, b0.getId()); + // make it dirty + found.setName("make it dirty"); + + // delete it, should remove it from the "live" part of persistence context + // with the expectation that no update is executed (no dirty in PC update) + DB.delete(found); + transaction.commit(); + } + + EBasicVer after = DB.find(EBasicVer.class, b0.getId()); + assertThat(after).isNull(); + } + @Test public void simpleInsertUpdateDelete_experimental() {