#2730 - Secondary @OneToMany fetch query is not happening if the same Entity type is fetched

This commit is contained in:
Rob Bygrave
2022-07-06 20:19:41 +12:00
parent 43dac07d5b
commit 88b6a60feb
7 changed files with 280 additions and 16 deletions
@@ -0,0 +1,51 @@
package org.tests.o2m.recurse;
import javax.persistence.*;
import java.util.List;
@Entity
public class RMItem {
@Id
private long itemId;
@ManyToOne
@JoinColumn(name = "item_group_id")
private RMItem itemGroup;
private String name;
@OneToMany(mappedBy = "itemGroup")
private List<RMItem> subItems;
public RMItem() {
}
public RMItem(String name) {
this.name = name;
}
public Long getItemId() {
return itemId;
}
public void setItemId(Long itemId) {
this.itemId = itemId;
}
public RMItem getItemGroup() {
return itemGroup;
}
public void setItemGroup(RMItem itemGroup) {
this.itemGroup = itemGroup;
}
public List<RMItem> getSubItems() {
return subItems;
}
public void setSubItems(List<RMItem> subItems) {
this.subItems = subItems;
}
}
@@ -0,0 +1,80 @@
package org.tests.o2m.recurse;
import io.ebean.Model;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Version;
@Entity
public class RMItemHolder extends Model {
@Id
long id;
String name;
String notes;
@ManyToOne
//@JoinColumn(name = "item_a_id")
private RMItem itemA;
@ManyToOne
//@JoinColumn(name = "item_b_id")
private RMItem itemB;
@Version
long version;
public RMItemHolder(String name) {
this.name = name;
}
public RMItemHolder() {
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
public RMItem getItemA() {
return itemA;
}
public void setItemA(RMItem itemA) {
this.itemA = itemA;
}
public RMItem getItemB() {
return itemB;
}
public void setItemB(RMItem itemB) {
this.itemB = itemB;
}
}
@@ -0,0 +1,133 @@
package org.tests.o2m.recurse;
import io.ebean.DB;
import io.ebean.Database;
import io.ebean.FetchConfig;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class TestFetchOneToManySameTypeTwoPaths {
@Test
void testSubItemListFetch_ofQuery() {
Database server = DB.getDefault();
RMItem itemA = new RMItem("a");
server.save(itemA);
RMItem itemB = new RMItem("b");
server.save(itemB);
for (int i=0; i<2; i++) {
RMItem subItem = new RMItem();
subItem.setItemGroup(itemA);
server.save(subItem);
}
for (int i=0; i<3; i++) {
RMItem subItem = new RMItem();
subItem.setItemGroup(itemB);
server.save(subItem);
}
RMItemHolder customer = new RMItemHolder();
customer.setItemA(itemA);
customer.setItemB(itemB);
server.save(customer);
// This is OK
{
RMItemHolder requestedCustomer = server.find(RMItemHolder.class)
.setDisableLazyLoading(true)
.fetch("itemA.subItems", FetchConfig.ofQuery())
.fetch("itemB.subItems", FetchConfig.ofQuery())
.where()
.eq("id", customer.getId())
.findOne();
assertEquals(2, requestedCustomer.getItemA().getSubItems().size());
assertEquals(3, requestedCustomer.getItemB().getSubItems().size());
}
}
@Test
void testSubItemListFetch_itemAFirst() {
Database server = DB.getDefault();
RMItem itemA = new RMItem("aa");
server.save(itemA);
RMItem itemB = new RMItem("bb");
server.save(itemB);
for (int i=0; i<2; i++) {
RMItem subItem = new RMItem();
subItem.setItemGroup(itemA);
server.save(subItem);
}
for (int i=0; i<3; i++) {
RMItem subItem = new RMItem();
subItem.setItemGroup(itemB);
server.save(subItem);
}
RMItemHolder customer = new RMItemHolder();
customer.setItemA(itemA);
customer.setItemB(itemB);
server.save(customer);
// This fails because requestedCustomer.getItemB().getSubItems() is not loaded
{
RMItemHolder requestedCustomer = server.find(RMItemHolder.class)
.setDisableLazyLoading(true)
.fetch("itemA.subItems")
.fetch("itemB.subItems")
.where()
.eq("id", customer.getId())
.findOne();
assertEquals(2, requestedCustomer.getItemA().getSubItems().size());
assertEquals(3, requestedCustomer.getItemB().getSubItems().size());
}
}
@Test
void testSubItemListFetch_itemBFirst() {
Database server = DB.getDefault();
RMItem itemA = new RMItem("a");
server.save(itemA);
RMItem itemB = new RMItem("b");
server.save(itemB);
for (int i=0; i<2; i++) {
RMItem subItem = new RMItem();
subItem.setItemGroup(itemA);
server.save(subItem);
}
for (int i=0; i<5; i++) {
RMItem subItem = new RMItem();
subItem.setItemGroup(itemB);
server.save(subItem);
}
RMItemHolder customer = new RMItemHolder();
customer.setItemA(itemA);
customer.setItemB(itemB);
server.save(customer);
// This fails because requestedCustomer.getItemA().getSubItems() is not loaded
{
RMItemHolder requestedCustomer = server.find(RMItemHolder.class)
.setDisableLazyLoading(true)
.fetch("itemB.subItems")
.fetch("itemA.subItems")
.where()
.eq("id", customer.getId())
.findOne();
assertEquals(2, requestedCustomer.getItemA().getSubItems().size());
assertEquals(5, requestedCustomer.getItemB().getSubItems().size());
System.out.println("here");
}
}
}