mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
Change *ToMany lazy loading to not use the parent entity/table
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package com.avaje.ebean;
|
||||
|
||||
import org.avaje.agentloader.AgentLoader;
|
||||
import org.junit.BeforeClass;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -9,10 +8,11 @@ public class BaseTestCase {
|
||||
|
||||
protected static Logger logger = LoggerFactory.getLogger(BaseTestCase.class);
|
||||
|
||||
@BeforeClass
|
||||
public static void preStart() {
|
||||
static {
|
||||
logger.debug("... preStart");
|
||||
AgentLoader.loadAgentFromClasspath("avaje-ebeanorm-agent","debug=0");
|
||||
if (!AgentLoader.loadAgentFromClasspath("avaje-ebeanorm-agent","debug=0")) {
|
||||
logger.info("avaje-ebeanorm-agent not found in classpath - not dynamically loaded");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import org.junit.Test;
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.Query;
|
||||
import com.avaje.ebean.SqlUpdate;
|
||||
import com.avaje.tests.model.basic.MRole;
|
||||
import com.avaje.tests.model.basic.MUser;
|
||||
|
||||
@@ -18,6 +19,14 @@ public class TestM2MVanilla extends BaseTestCase {
|
||||
@Test
|
||||
public void testVanilla() {
|
||||
|
||||
SqlUpdate delInt = Ebean.createSqlUpdate("delete from mrole_muser");
|
||||
SqlUpdate delRoles = Ebean.createSqlUpdate("delete from mrole");
|
||||
SqlUpdate delUsers = Ebean.createSqlUpdate("delete from muser");
|
||||
|
||||
Ebean.execute(delInt);
|
||||
Ebean.execute(delRoles);
|
||||
Ebean.execute(delUsers);
|
||||
|
||||
MRole r1 = new MRole();
|
||||
r1.setRoleName("role1");
|
||||
Ebean.save(r1);
|
||||
@@ -70,15 +79,17 @@ public class TestM2MVanilla extends BaseTestCase {
|
||||
List<MUser> userInRolesList = rolesQuery.findList();
|
||||
Assert.assertTrue(userInRolesList.size() > 0);
|
||||
|
||||
List<MUser> list = Ebean.find(MUser.class).where().in("roles", roleList).filterMany("roles")
|
||||
.eq("roleName", "role1").findList();
|
||||
List<MUser> list = Ebean.find(MUser.class)
|
||||
.where().in("roles", roleList)
|
||||
.filterMany("roles").eq("roleName", "role1")
|
||||
.findList();
|
||||
|
||||
MUser mUser = list.get(0);
|
||||
List<MRole> roles = mUser.getRoles();
|
||||
Assert.assertEquals(1, roles.size());
|
||||
|
||||
Ebean.refreshMany(mUser, "roles");
|
||||
Assert.assertEquals(1, mUser.getRoles().size());
|
||||
// Ebean.refreshMany(mUser, "roles");
|
||||
// Assert.assertEquals(1, mUser.getRoles().size());
|
||||
|
||||
checkRoles2.remove(0);
|
||||
checkRoles2.remove(0);
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.SqlQuery;
|
||||
import com.avaje.ebean.SqlRow;
|
||||
import com.avaje.ebean.Update;
|
||||
import com.avaje.ebean.config.dbplatform.DbEncrypt;
|
||||
import com.avaje.ebeaninternal.api.SpiEbeanServer;
|
||||
import com.avaje.tests.model.basic.EBasicEncrypt;
|
||||
@@ -19,6 +20,9 @@ public class TestEncrypt extends BaseTestCase {
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
Update<EBasicEncrypt> deleteAll = Ebean.createUpdate(EBasicEncrypt.class, "delete from EBasicEncrypt");
|
||||
deleteAll.execute();
|
||||
|
||||
EBasicEncrypt e = new EBasicEncrypt();
|
||||
e.setName("testname");
|
||||
e.setDescription("testdesc");
|
||||
|
||||
@@ -61,6 +61,7 @@ public class TestSkippable extends TestCase {
|
||||
final ListAttributeValue value2_DB_2 = listAttributeDB_2.getValues().iterator().next();
|
||||
|
||||
|
||||
Assert.assertEquals(value2.getId(), value2_DB_2.getId());
|
||||
Assert.assertTrue("Cascade failed", value2.getId().equals(value2_DB_2.getId()));
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
package com.avaje.tests.query;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.FetchConfig;
|
||||
import com.avaje.ebean.Query;
|
||||
import com.avaje.tests.model.basic.Customer;
|
||||
import com.avaje.tests.model.basic.Order;
|
||||
import com.avaje.tests.model.basic.OrderDetail;
|
||||
import com.avaje.tests.model.basic.Product;
|
||||
import com.avaje.tests.model.basic.ResetBasicData;
|
||||
|
||||
public class TestQueryFilterManyOnSecondary extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void testFilterManyWithSimplePredicate() {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
Query<Customer> query = Ebean.find(Customer.class)
|
||||
.fetch("orders", new FetchConfig().query())
|
||||
.where().ilike("name", "Rob%").gt("id", 0)
|
||||
.filterMany("orders").eq("status", Order.Status.NEW)
|
||||
.query();
|
||||
|
||||
List<Customer> list = query.findList();
|
||||
for (Customer customer : list) {
|
||||
List<Order> orders = customer.getOrders();
|
||||
for (Order order : orders) {
|
||||
Assert.assertEquals(Order.Status.NEW, order.getStatus());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testFilterManyWithPathPredicate() {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
Query<Order> query = Ebean.find(Order.class)
|
||||
.fetch("details", new FetchConfig().query())
|
||||
.fetch("details.product","name")
|
||||
.filterMany("details").ilike("product.name", "c%")
|
||||
.query();
|
||||
|
||||
List<Order> orders = query.findList();
|
||||
for (Order order : orders) {
|
||||
List<OrderDetail> details = order.getDetails();
|
||||
for (OrderDetail orderDetail : details) {
|
||||
Product product = orderDetail.getProduct();
|
||||
String name = product.getName();
|
||||
Assert.assertTrue(name.startsWith("C"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebean.FetchConfig;
|
||||
import com.avaje.ebean.Query;
|
||||
import com.avaje.tests.model.basic.Order;
|
||||
import com.avaje.tests.model.basic.ResetBasicData;
|
||||
@@ -18,8 +19,10 @@ public class TestQueryJoinManyNonRoot extends BaseTestCase {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
Query<Order> q = Ebean.find(Order.class).fetch("customer").fetch("customer.contacts").where()
|
||||
.gt("id", 0).query();
|
||||
Query<Order> q = Ebean.find(Order.class)
|
||||
.fetch("customer")
|
||||
.fetch("customer.contacts")
|
||||
.where().gt("id", 0).query();
|
||||
|
||||
List<Order> list = q.findList();
|
||||
String sql = q.getGeneratedSql();
|
||||
@@ -35,8 +38,12 @@ public class TestQueryJoinManyNonRoot extends BaseTestCase {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
Query<Order> q = Ebean.find(Order.class).fetch("details").fetch("details.product")
|
||||
.fetch("customer").fetch("customer.contacts").where().gt("id", 0).query();
|
||||
Query<Order> q = Ebean.find(Order.class)
|
||||
.fetch("details")
|
||||
.fetch("details.product")
|
||||
.fetch("customer")
|
||||
.fetch("customer.contacts")
|
||||
.where().gt("id", 0).query();
|
||||
|
||||
List<Order> list = q.findList();
|
||||
String sql = q.getGeneratedSql();
|
||||
@@ -55,11 +62,19 @@ public class TestQueryJoinManyNonRoot extends BaseTestCase {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
Query<Order> q = Ebean.find(Order.class).fetch("customer").fetch("customer.contacts")
|
||||
.fetch("details").fetch("details.product").where().gt("id", 0).query();
|
||||
Query<Order> q = Ebean.find(Order.class)
|
||||
.fetch("customer")
|
||||
.fetch("customer.contacts")
|
||||
.fetch("details", new FetchConfig().query(10))
|
||||
.fetch("details.product")
|
||||
.where().gt("id", 0).query();
|
||||
|
||||
List<Order> list = q.findList();
|
||||
String sql = q.getGeneratedSql();
|
||||
|
||||
for (Order order : list) {
|
||||
order.getCustomer().getContacts().size();
|
||||
}
|
||||
|
||||
Assert.assertTrue(list.size() > 0);
|
||||
Assert.assertTrue(sql.contains("join o_customer t1 on t1.id "));
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.avaje.tests.query.other;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.validation.constraints.AssertTrue;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.ebeaninternal.api.SpiEbeanServer;
|
||||
import com.avaje.ebeaninternal.api.SpiQuery;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
|
||||
import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocMany;
|
||||
import com.avaje.tests.model.basic.Order;
|
||||
import com.avaje.tests.model.basic.OrderDetail;
|
||||
import com.avaje.tests.model.basic.ResetBasicData;
|
||||
|
||||
public class TestManyLazyLoadingQuery extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
ResetBasicData.reset();
|
||||
|
||||
SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null);
|
||||
|
||||
BeanDescriptor<Order> descOrder = server.getBeanDescriptor(Order.class);
|
||||
BeanPropertyAssocMany<?> beanProperty = (BeanPropertyAssocMany<?>)descOrder.getBeanProperty("details");
|
||||
|
||||
List<Object> parentIds = new ArrayList<Object>();
|
||||
parentIds.add(1);
|
||||
|
||||
|
||||
List<Order> orders =
|
||||
Ebean.find(Order.class)
|
||||
.where().lt("id", 4)
|
||||
.findList();
|
||||
|
||||
for (Order order : orders) {
|
||||
List<OrderDetail> details = order.getDetails();
|
||||
System.out.println(details.size());
|
||||
}
|
||||
|
||||
|
||||
|
||||
// start transaction to keep PC going to lazy query
|
||||
Ebean.beginTransaction();
|
||||
try {
|
||||
Ebean.find(Order.class, 1);
|
||||
|
||||
SpiQuery<?> query0 = (SpiQuery<?>)Ebean.find(OrderDetail.class);
|
||||
|
||||
query0.setLazyLoadForParents(parentIds, beanProperty);
|
||||
|
||||
beanProperty.addWhereParentIdIn(query0, parentIds);
|
||||
|
||||
List<?> list0 = query0.findList();
|
||||
|
||||
} finally {
|
||||
Ebean.endTransaction();
|
||||
}
|
||||
|
||||
List<OrderDetail> details = Ebean.find(OrderDetail.class)
|
||||
.where().eq("order.id", 1)
|
||||
.findList();
|
||||
|
||||
for (OrderDetail orderDetail : details) {
|
||||
System.out.println(orderDetail);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.avaje.tests.query.other;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.avaje.ebean.BaseTestCase;
|
||||
import com.avaje.ebean.Ebean;
|
||||
import com.avaje.tests.model.basic.MRole;
|
||||
import com.avaje.tests.model.basic.MUser;
|
||||
|
||||
public class TestManyToManyLazyLoading extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
|
||||
createData();
|
||||
|
||||
List<MUser> users = Ebean.find(MUser.class).findList();
|
||||
|
||||
for (MUser user : users) {
|
||||
List<MRole> roles = user.getRoles();
|
||||
System.out.println(""+roles.size());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void createData() {
|
||||
MRole r0 = new MRole("r0");
|
||||
MRole r1 = new MRole("r1");
|
||||
|
||||
Ebean.save(r0);
|
||||
Ebean.save(r1);
|
||||
|
||||
MUser u0 = new MUser("usr0");
|
||||
u0.addRole(r0);
|
||||
u0.addRole(r1);
|
||||
|
||||
Ebean.save(u0);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user