From 01e7ddcffd6fb49e73f4360a91e67f585aba6aa4 Mon Sep 17 00:00:00 2001 From: Vladimir Konkov Date: Mon, 20 Sep 2021 20:02:58 +0300 Subject: [PATCH] Try to fix ClassCastException in isToManyDirty() check --- .../server/deploy/BeanDescriptor.java | 4 +-- .../TestTransparentPersist.java | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 0635d5e06..d50f67423 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -2875,8 +2875,8 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { final EntityBeanIntercept ebi = bean._ebean_getIntercept(); for (BeanPropertyAssocMany many : propertiesManySave) { if (ebi.isLoadedProperty(many.propertyIndex())) { - final BeanCollection value = (BeanCollection) many.getValue(bean); - if (value != null && value.hasModifications()) { + final Object value = many.getValue(bean); + if (value instanceof BeanCollection && ((BeanCollection)value).hasModifications() || value != null) { return true; } } diff --git a/ebean-test/src/test/java/org/tests/transparentpersist/TestTransparentPersist.java b/ebean-test/src/test/java/org/tests/transparentpersist/TestTransparentPersist.java index ed0cfb175..60db7b27b 100644 --- a/ebean-test/src/test/java/org/tests/transparentpersist/TestTransparentPersist.java +++ b/ebean-test/src/test/java/org/tests/transparentpersist/TestTransparentPersist.java @@ -13,6 +13,7 @@ import org.tests.model.basic.EBasicVer; import org.tests.model.basic.Order; import org.tests.model.basic.OrderShipment; +import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -176,6 +177,38 @@ public class TestTransparentPersist extends BaseTestCase { DB.delete(Customer.class, c0.getId()); } + @Test + public void insertWithPersistCascadeInsert() { + + // setup data + Customer c0 = new Customer(); + c0.setName("firstCust"); + DB.save(c0); + + Integer orderId; + try (Transaction transaction = DB.beginTransaction()) { + transaction.setAutoPersistUpdates(true); // EXPERIMENTAL feature + Order order = new Order(); + order.setStatus(Order.Status.NEW); + order.setCustomer(c0); + order.setShipments(new ArrayList<>()); + DB.insert(order); + orderId = order.getId(); + // cascade persist will insert this Shipment (even though it isn't in the persistence context) + OrderShipment osh0 = new OrderShipment(); + order.addShipment(osh0); + transaction.commit(); + } + + Order checkOrder = DB.find(Order.class, orderId); + + assertThat(checkOrder.getStatus()).isEqualTo(Order.Status.NEW); + assertThat(checkOrder.getShipments().size()).isEqualTo(1); + + DB.delete(checkOrder); + DB.delete(Customer.class, c0.getId()); + } + @Test public void updateReferenceOnlyWithPersistCascade_Insert_andUpdateForeignKey() {