diff --git a/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java b/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java index cb4a87cb6..5f6a84ea3 100644 --- a/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java +++ b/src/main/java/io/ebeaninternal/server/persist/SaveManyBeans.java @@ -179,6 +179,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)); + } } } } diff --git a/src/test/java/org/tests/order/TestOrderColumn.java b/src/test/java/org/tests/order/TestOrderColumn.java index 3cd40ea4d..27bc69c35 100644 --- a/src/test/java/org/tests/order/TestOrderColumn.java +++ b/src/test/java/org/tests/order/TestOrderColumn.java @@ -5,6 +5,7 @@ import io.ebean.TransactionalTestCase; import org.ebeantest.LoggedSqlCollector; import org.junit.Test; +import java.util.Comparator; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -31,6 +32,35 @@ 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"); + } + @Test public void testModifyTree() { final OrderMaster master = new OrderMaster();