refresh does not work on oneToMany if property was not yet accessed

(cherry picked from commit 446103e6e06d7583f8b2bb847907d7fc77a8be9f)
This commit is contained in:
Roland Praml
2019-07-26 12:14:30 +02:00
parent 114693b7cd
commit b111fcfecc
@@ -3,12 +3,14 @@ package io.ebean;
import org.junit.Test;
import org.tests.model.basic.EBasic;
import org.tests.model.basic.Order;
import org.tests.model.basic.OrderDetail;
import org.tests.model.basic.ResetBasicData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
public class EbeanServer_refresh {
@@ -77,4 +79,77 @@ public class EbeanServer_refresh {
Ebean.refresh(order);
}
@Test
public void refresh_on_details_new() {
ResetBasicData.reset();
Order order = Ebean.find(Order.class, 1);
DB.refresh(order); // call refresh BEFORE first access on "getDetail";
assertThat(order.getDetails()).hasSize(3);
OrderDetail detail = new OrderDetail();
detail.setOrder(order);
DB.save(detail);
try {
assertThat(order.getDetails()).hasSize(3);
DB.refresh(order);
assertThat(order.getDetails()).hasSize(4);
} finally {
DB.delete(detail); // restore old state
}
DB.refresh(order);
assertThat(order.getDetails()).hasSize(3);
}
@Test
public void refresh_on_details_changed() {
ResetBasicData.reset();
Order order = Ebean.find(Order.class, 1);
DB.refresh(order); // call refresh BEFORE first access on "getDetail"
// this changes the loader of the details-bean collection from DefaultServer to DLoadManyContext$LoadBuffer
// if this refresh is commented out, the test will pass
assertThat(order.getDetails().get(0).getOrderQty()).isEqualTo(5);
// search the detail in the DB and change qty to 42
OrderDetail detail = DB.find(OrderDetail.class, order.getDetails().get(0).getId());
assertThat(order.getDetails().get(0)).isEqualTo(detail).isNotSameAs(detail);
detail.setOrderQty(42);
DB.save(detail);
try {
assertThat(order.getDetails().get(0).getOrderQty()).isEqualTo(5);
DB.refresh(order);
assertThat(order.getDetails().get(0).getOrderQty()).isEqualTo(42);
} finally {
// restore old value
detail.setOrderQty(5);
DB.save(detail);
}
DB.refresh(order);
assertThat(order.getDetails().get(0).getOrderQty()).isEqualTo(5);
}
}