From e05b6b78add5f02a399f70445ea449b606630dac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20P=C3=B6hler=20=28JPo=29?= Date: Wed, 8 Apr 2020 16:04:49 +0200 Subject: [PATCH 1/2] ADD: failing testcase for not cleared beancache in persistence context on reorder with @OrderColumn MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jonas Pöhler (JPo) --- .../java/org/tests/order/TestOrderColumn.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/test/java/org/tests/order/TestOrderColumn.java b/src/test/java/org/tests/order/TestOrderColumn.java index cb0477e31..344c13844 100644 --- a/src/test/java/org/tests/order/TestOrderColumn.java +++ b/src/test/java/org/tests/order/TestOrderColumn.java @@ -4,6 +4,8 @@ import io.ebean.Ebean; import io.ebean.TransactionalTestCase; import org.junit.Test; +import java.util.Comparator; + import static org.assertj.core.api.Assertions.assertThat; public class TestOrderColumn extends TransactionalTestCase { @@ -28,4 +30,33 @@ public class TestOrderColumn extends TransactionalTestCase { assertThat(result.getChildren()).extracting(OrderReferencedChild::getChildName).containsExactly("c0", "c1", "c2", "c3", "c4"); } + @Test + public void testOrderColumnSortChange() { + final OrderMaster master = new OrderMaster(); + + for (int i = 0; i < 5; i++) { + final OrderReferencedChild child = new OrderReferencedChild("p" + i); + child.setChildName("c" + i); + + master.getChildren().add(child); + } + + Ebean.save(master); + + OrderMaster result = Ebean.find(OrderMaster.class).findOne(); + + assertThat(result.getChildren()).hasSize(5); + assertThat(master.getChildren()).extracting(OrderReferencedChild::getName).containsExactly("p0", "p1", "p2", "p3", "p4"); + + master.getChildren().sort(Comparator.comparing(OrderReferencedChild::getName).reversed()); + assertThat(master.getChildren()).extracting(OrderReferencedChild::getName).containsExactly("p4", "p3", "p2", "p1", "p0"); + + Ebean.save(master); + + result = Ebean.find(OrderMaster.class).findOne(); + + assertThat(result.getChildren()).hasSize(5); + assertThat(result.getChildren()).extracting(OrderReferencedChild::getName).containsExactly("p4", "p3", "p2", "p1", "p0"); + } + } From 18cde36b9d861244cc0192546883064dd75d5ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20P=C3=B6hler=20=28JPo=29?= Date: Wed, 8 Apr 2020 16:05:09 +0200 Subject: [PATCH 2/2] FIX: cache not being cleared in persistence context on reorder with @OrderColumn MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jonas Pöhler (JPo) --- .../java/io/ebeaninternal/server/persist/SaveManyBeans.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java b/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java index 653d387f1..738a280d9 100644 --- a/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java +++ b/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java @@ -178,6 +178,11 @@ public class SaveManyBeans extends SaveManyBase { if (!skipSavingThisBean) { persister.saveRecurse(detail, transaction, parentBean, request.getFlags()); + if (many.hasOrderColumn()) { + // Clear the bean from the PersistenceContext (L1 cache), because the order of referenced beans might have changed + final BeanDescriptor beanDescriptor = many.getBeanDescriptor(); + beanDescriptor.contextClear(transaction.getPersistenceContext(), beanDescriptor.getId(parentBean)); + } } } }