mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
Fix for #228 - LazyLoad bug with QueryIterator. Getting EntityNotFoundException("Bean has been deleted - lazy loading failed")
This commit is contained in:
@@ -2,17 +2,20 @@ package com.avaje.tests.query;
|
||||
|
||||
import javax.persistence.PersistenceException;
|
||||
|
||||
import org.junit.Assert;
|
||||
import com.avaje.ebean.*;
|
||||
import com.avaje.tests.model.basic.Order;
|
||||
import com.avaje.tests.model.basic.OrderShipment;
|
||||
import org.avaje.ebeantest.LoggedSqlCollector;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.EbeanServer;
|
||||
import com.avaje.ebean.Query;
|
||||
import com.avaje.ebean.QueryIterator;
|
||||
import com.avaje.tests.model.basic.Customer;
|
||||
import com.avaje.tests.model.basic.ResetBasicData;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class TestQueryFindIterate extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
@@ -40,9 +43,108 @@ public class TestQueryFindIterate extends BaseTestCase {
|
||||
it.close();
|
||||
}
|
||||
|
||||
Assert.assertEquals(2, count);
|
||||
assertEquals(2, count);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testWithLazyLoading() {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
QueryIterator<Order> queryIterator = Ebean.find(Order.class)
|
||||
//.select("orderDate")
|
||||
.where().gt("id",0).le("id",10)
|
||||
.findIterate();
|
||||
|
||||
try {
|
||||
while (queryIterator.hasNext()) {
|
||||
Order order = queryIterator.next();
|
||||
Customer customer = order.getCustomer();
|
||||
// invoke lazy loading on customer, order details and order shipments
|
||||
System.out.println("order: " + order.getId() + " customerName:" + customer.getName()+" details:"+order.getDetails().size()+" shipments:"+order.getShipments().size());
|
||||
}
|
||||
|
||||
} finally {
|
||||
queryIterator.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWithLazyBatchSize() {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
LoggedSqlCollector.start();
|
||||
|
||||
QueryIterator<Order> queryIterator = Ebean.find(Order.class)
|
||||
.setLazyLoadBatchSize(10)
|
||||
.select("status, orderDate")
|
||||
.fetch("customer", "name")
|
||||
.where().gt("id",0).le("id",10)
|
||||
.findIterate();
|
||||
|
||||
try {
|
||||
while (queryIterator.hasNext()) {
|
||||
Order order = queryIterator.next();
|
||||
Customer customer = order.getCustomer();
|
||||
System.out.println("order: " + order.getId() + " customerName:" + customer.getName()+" details:"+order.getDetails().size()+" shipments:"+order.getShipments().size());
|
||||
}
|
||||
|
||||
} finally {
|
||||
queryIterator.close();
|
||||
}
|
||||
|
||||
List<String> loggedSql = LoggedSqlCollector.stop();
|
||||
|
||||
assertEquals(3, loggedSql.size());
|
||||
assertTrue(loggedSql.get(0).contains("select t0.id c0, t0.status c1, t0.order_date c2, t1.id c3, t1.name c4 from o_order t0 join o_customer t1"));
|
||||
assertTrue(loggedSql.get(1).contains("select t0.order_id c0, t0.id c1, t0.order_qty c2, t0.ship_qty c3, t0.unit_price c4"));
|
||||
assertTrue(loggedSql.get(2).contains("select t0.order_id c0, t0.id c1, t0.ship_time c2, t0.cretime c3, t0.updtime c4, t0.order_id c5 from or_order_ship"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWithTwoJoins() {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
LoggedSqlCollector.start();
|
||||
|
||||
// make sure we don't hit the L2 cache for order shipments
|
||||
Ebean.getServerCacheManager().getBeanCache(Order.class).clear();
|
||||
Ebean.getServerCacheManager().getQueryCache(Order.class).clear();
|
||||
Ebean.getServerCacheManager().getBeanCache(OrderShipment.class).clear();
|
||||
Ebean.getServerCacheManager().getQueryCache(OrderShipment.class).clear();
|
||||
|
||||
QueryIterator<Order> queryIterator = Ebean.find(Order.class)
|
||||
.setLazyLoadBatchSize(10)
|
||||
.setUseCache(false)
|
||||
.setUseQueryCache(false)
|
||||
.select("status, orderDate")
|
||||
.fetch("customer", "name")
|
||||
.fetch("details")
|
||||
.where().gt("id",0).le("id",10)
|
||||
.order().asc("id")
|
||||
.findIterate();
|
||||
|
||||
try {
|
||||
while (queryIterator.hasNext()) {
|
||||
Order order = queryIterator.next();
|
||||
Customer customer = order.getCustomer();
|
||||
System.out.println("order: " + order.getId() + " customerName:" + customer.getName()+" details:"+order.getDetails().size()+" shipments:"+order.getShipments().size());
|
||||
}
|
||||
|
||||
} finally {
|
||||
queryIterator.close();
|
||||
}
|
||||
|
||||
List<String> loggedSql = LoggedSqlCollector.stop();
|
||||
|
||||
assertEquals("Got SQL: "+loggedSql, 2, loggedSql.size());
|
||||
assertTrue(loggedSql.get(0).contains("select t0.id c0, t0.status c1, t0.order_date c2, t1.id c3, t1.name c4, t2.id c5, t2.order_qty c6, t2.ship_qty"));
|
||||
assertTrue(loggedSql.get(1).contains("select t0.order_id c0, t0.id c1, t0.ship_time c2, t0.cretime c3, t0.updtime c4, t0.order_id c5 from or_order_ship"));
|
||||
}
|
||||
|
||||
@Test(expected=PersistenceException.class)
|
||||
public void testWithExceptionInQuery() {
|
||||
|
||||
@@ -59,7 +161,7 @@ public class TestQueryFindIterate extends BaseTestCase {
|
||||
// this throws an exception immediately
|
||||
QueryIterator<Customer> it = query.findIterate();
|
||||
it.hashCode();
|
||||
Assert.assertTrue("Never get here as exception thrown", false);
|
||||
assertTrue("Never get here as exception thrown", false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user