From 0ca4f92b2650d62c44ae3d74d28ec79f22a68fc4 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Mon, 14 Mar 2016 20:10:07 +1300 Subject: [PATCH] #592 - Fetched empty collection of null child of parent entity --- .../server/query/SqlTreeNodeManyRoot.java | 4 +- .../com/avaje/tests/model/tevent/TEvent.java | 57 ++++++++++++++++ .../avaje/tests/model/tevent/TEventMany.java | 53 +++++++++++++++ .../avaje/tests/model/tevent/TEventOne.java | 66 +++++++++++++++++++ .../tevent/TestAssocOneNullTraverse.java | 19 ++++++ 5 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/avaje/tests/model/tevent/TEvent.java create mode 100644 src/test/java/com/avaje/tests/model/tevent/TEventMany.java create mode 100644 src/test/java/com/avaje/tests/model/tevent/TEventOne.java create mode 100644 src/test/java/com/avaje/tests/model/tevent/TestAssocOneNullTraverse.java diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeManyRoot.java b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeManyRoot.java index 024b2c317..d3813c7e0 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeManyRoot.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/SqlTreeNodeManyRoot.java @@ -24,7 +24,9 @@ public final class SqlTreeNodeManyRoot extends SqlTreeNodeBean { // being set to the parentBean directly EntityBean detailBean = super.load(cquery, null, null); // initialise the collection and add detailBean if it is not null - manyProp.addBeanToCollectionWithCreate(contextParent, detailBean, false); + if (contextParent != null) { + manyProp.addBeanToCollectionWithCreate(contextParent, detailBean, false); + } return detailBean; } diff --git a/src/test/java/com/avaje/tests/model/tevent/TEvent.java b/src/test/java/com/avaje/tests/model/tevent/TEvent.java new file mode 100644 index 000000000..b0b54346a --- /dev/null +++ b/src/test/java/com/avaje/tests/model/tevent/TEvent.java @@ -0,0 +1,57 @@ +package com.avaje.tests.model.tevent; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToOne; +import javax.persistence.Version; + +@Entity +public class TEvent { + + @Id + Long id; + + String name; + + @OneToOne(mappedBy = "event") + TEventOne one; + + @Version + Long version; + + public TEvent(String name) { + this.name = name; + } + + 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 TEventOne getOne() { + return one; + } + + public void setOne(TEventOne one) { + this.one = one; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } +} diff --git a/src/test/java/com/avaje/tests/model/tevent/TEventMany.java b/src/test/java/com/avaje/tests/model/tevent/TEventMany.java new file mode 100644 index 000000000..9986d167e --- /dev/null +++ b/src/test/java/com/avaje/tests/model/tevent/TEventMany.java @@ -0,0 +1,53 @@ +package com.avaje.tests.model.tevent; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Version; + +@Entity +public class TEventMany { + + @Id + Long id; + + String many; + + @ManyToOne + TEventOne one; + + @Version + Long version; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getMany() { + return many; + } + + public void setMany(String many) { + this.many = many; + } + + public TEventOne getOne() { + return one; + } + + public void setOne(TEventOne one) { + this.one = one; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } +} diff --git a/src/test/java/com/avaje/tests/model/tevent/TEventOne.java b/src/test/java/com/avaje/tests/model/tevent/TEventOne.java new file mode 100644 index 000000000..617b18a56 --- /dev/null +++ b/src/test/java/com/avaje/tests/model/tevent/TEventOne.java @@ -0,0 +1,66 @@ +package com.avaje.tests.model.tevent; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Version; +import java.util.List; + +@Entity +public class TEventOne { + + @Id + Long id; + + String one; + + @Version + Long version; + + @OneToOne + TEvent event; + + @OneToMany(mappedBy = "one") + List many; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getOne() { + return one; + } + + public void setOne(String one) { + this.one = one; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + public TEvent getEvent() { + return event; + } + + public void setEvent(TEvent event) { + this.event = event; + } + + public List getMany() { + return many; + } + + public void setMany(List many) { + this.many = many; + } +} diff --git a/src/test/java/com/avaje/tests/model/tevent/TestAssocOneNullTraverse.java b/src/test/java/com/avaje/tests/model/tevent/TestAssocOneNullTraverse.java new file mode 100644 index 000000000..dcb79f4cc --- /dev/null +++ b/src/test/java/com/avaje/tests/model/tevent/TestAssocOneNullTraverse.java @@ -0,0 +1,19 @@ +package com.avaje.tests.model.tevent; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.Ebean; +import org.junit.Test; + +public class TestAssocOneNullTraverse extends BaseTestCase { + + @Test + public void test() { + + TEvent event = new TEvent("event"); + Ebean.save(event); + + Ebean.find(TEvent.class) + .fetch("one.many") + .findList(); + } +}