Skip to content

Commit ddffc8e

Browse files
authored
Merge pull request #3581 from apflieger/#3573-initfields-prevent-secondary-query
OneToMany initialisation via List.of() - was Tests only - new test on multiple many joins
2 parents a59f75a + 7f1a3a4 commit ddffc8e

File tree

7 files changed

+159
-4
lines changed

7 files changed

+159
-4
lines changed

ebean-test/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@
309309
<extensions>true</extensions>
310310
<configuration>
311311
<tiles>
312-
<tile>io.ebean.tile:enhancement:14.9.0</tile>
312+
<tile>io.ebean.tile:enhancement:14.10.0</tile>
313313
</tiles>
314314
</configuration>
315315
</plugin>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.tests.model.join.initfields;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.Id;
5+
import jakarta.persistence.OneToMany;
6+
import jakarta.persistence.Table;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
@Entity
12+
@Table(name = "join_initfields_order")
13+
public class Order {
14+
@Id
15+
int id;
16+
17+
@OneToMany
18+
List<OrderItem> orderItems = new ArrayList<>();
19+
20+
@OneToMany
21+
List<OrderDetail> orderDetails = new ArrayList<>();
22+
23+
@OneToMany
24+
public List<OrderInvoice> orderInvoices = List.of(); // Change this to new ArrayList<>() to make the test pass.
25+
26+
public int id() {
27+
return id;
28+
}
29+
30+
public List<OrderItem> orderItems() {
31+
return orderItems;
32+
}
33+
34+
public List<OrderDetail> orderDetails() {
35+
return orderDetails;
36+
}
37+
38+
public List<OrderInvoice> orderInvoices() {
39+
return orderInvoices;
40+
}
41+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.tests.model.join.initfields;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.Id;
5+
import jakarta.persistence.ManyToOne;
6+
import jakarta.persistence.Table;
7+
8+
@Entity
9+
@Table(name="join_initfields_order_detail")
10+
public class OrderDetail {
11+
@Id
12+
int id;
13+
14+
@ManyToOne
15+
Order order;
16+
17+
public OrderDetail(Order order) {
18+
this.order = order;
19+
}
20+
21+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.tests.model.join.initfields;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.Id;
5+
import jakarta.persistence.ManyToOne;
6+
import jakarta.persistence.Table;
7+
8+
@Entity
9+
@Table(name="join_initfields_order_invoice")
10+
public class OrderInvoice {
11+
@Id
12+
int id;
13+
14+
@ManyToOne
15+
Order order;
16+
17+
public OrderInvoice(Order order) {
18+
this.order = order;
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.tests.model.join.initfields;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.Id;
5+
import jakarta.persistence.ManyToOne;
6+
import jakarta.persistence.Table;
7+
8+
@Entity
9+
@Table(name="join_initfields_order_item")
10+
public class OrderItem {
11+
@Id
12+
int id;
13+
14+
@ManyToOne
15+
Order order;
16+
17+
public OrderItem(Order order) {
18+
this.order = order;
19+
}
20+
}

ebean-test/src/test/java/org/tests/model/lazywithid/Tune.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package org.tests.model.lazywithid;
22

3-
import io.ebean.common.BeanList;
4-
53
import jakarta.persistence.*;
64
import java.util.List;
75

@@ -15,7 +13,7 @@ public class Tune {
1513
String name;
1614

1715
@OneToMany(cascade = CascadeType.ALL)
18-
private List<Looney> loonies = new BeanList<>();
16+
private List<Looney> loonies;
1917

2018
public String getName() {
2119
return name;

ebean-test/src/test/java/org/tests/query/TestQueryMultiJoinFetchPath.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package org.tests.query;
22

3+
import io.ebean.test.LoggedSql;
34
import io.ebean.xtest.BaseTestCase;
45
import io.ebean.DB;
56
import io.ebean.Query;
67
import org.junit.jupiter.api.Test;
78
import org.tests.model.join.*;
9+
import org.tests.model.join.initfields.Order;
10+
import org.tests.model.join.initfields.OrderDetail;
11+
import org.tests.model.join.initfields.OrderInvoice;
12+
import org.tests.model.join.initfields.OrderItem;
813

914
import java.util.List;
1015

@@ -65,4 +70,54 @@ void test() {
6570
}
6671
}
6772

73+
@Test
74+
public void test_manyNonRoot_RootHasNoMany() {
75+
Order o = new Order();
76+
DB.save(o);
77+
78+
OrderItem p1 = new OrderItem(o);
79+
OrderItem p2 = new OrderItem(o);
80+
OrderDetail d1 = new OrderDetail(o);
81+
OrderDetail d2 = new OrderDetail(o);
82+
OrderInvoice i1 = new OrderInvoice(o);
83+
OrderInvoice i2 = new OrderInvoice(o);
84+
85+
DB.saveAll(p1, p2, d1, d2, i1, i2);
86+
87+
// This first query behaves as expected: a main query and its secondary query.
88+
LoggedSql.start();
89+
List<Order> list1 = DB.find(Order.class)
90+
.fetch("orderItems")
91+
.fetch("orderDetails")
92+
.where().gt("id", 0)
93+
.findList();
94+
95+
List<String> sql1 = LoggedSql.collect();
96+
assertThat(sql1).hasSize(2);
97+
98+
assertThat(list1.get(0).orderItems()).hasSize(2);
99+
assertThat(list1.get(0).orderDetails()).hasSize(2);
100+
101+
sql1 = LoggedSql.collect();
102+
assertThat(sql1).describedAs("no further lazy loading occurs").isEmpty();
103+
104+
// This query does not eager fetch invoices. We get an NPE on orderInvoices. Only the main query is executed.
105+
LoggedSql.collect();
106+
List<Order> list2 = DB.find(Order.class)
107+
.fetch("orderItems")
108+
.fetch("orderInvoices")
109+
.where().gt("id", 0)
110+
.findList();
111+
112+
List<String> sql2 = LoggedSql.collect();
113+
assertThat(sql2).hasSize(2);
114+
assertThat(sql2.get(0)).contains("from join_initfields_order t0 left join join_initfields_order_item t1 on t1.order_id = t0.id where");
115+
assertThat(sql2.get(1)).contains("from join_initfields_order_invoice t0 where ");
116+
117+
assertThat(list2.get(0).orderItems()).hasSize(2);
118+
assertThat(list2.get(0).orderInvoices()).hasSize(2);
119+
120+
sql2 = LoggedSql.stop();
121+
assertThat(sql2).describedAs("no further lazy loading occurs").isEmpty();
122+
}
68123
}

0 commit comments

Comments
 (0)