diff --git a/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java b/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java index 563a36cce..319dc89f0 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java +++ b/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java @@ -21,7 +21,9 @@ class AssocOneHelpRefInherit extends AssocOneHelp { @Override void loadIgnore(DbReadContext ctx) { property.targetIdBinder.loadIgnore(ctx); - ctx.getDataReader().incrementPos(1); + if (inherit.hasChildren()) { + ctx.getDataReader().incrementPos(1); + } } /** diff --git a/src/test/java/org/tests/model/carwheeltruck/TTruckHolder.java b/src/test/java/org/tests/model/carwheeltruck/TTruckHolder.java new file mode 100644 index 000000000..74f9e8248 --- /dev/null +++ b/src/test/java/org/tests/model/carwheeltruck/TTruckHolder.java @@ -0,0 +1,85 @@ +package org.tests.model.carwheeltruck; + +import org.tests.model.basic.EBasic; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Version; +import java.util.List; + +import static javax.persistence.CascadeType.ALL; + +@Entity +public class TTruckHolder { + + @Id + private long id; + + @Version + private long version; + + private final String name; + + /** + * Inheritance but at BOTTOM layer (so no discriminator needed). + */ + @ManyToOne(optional = false) + private TTruck truck; + + @ManyToOne + private EBasic basic; + + @OneToMany(cascade = ALL, mappedBy = "owner") + private List items; + + public TTruckHolder(String name, TTruck truck) { + this.name = name; + this.truck = truck; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } + + public String getName() { + return name; + } + + public TTruck getTruck() { + return truck; + } + + public void setTruck(TTruck truck) { + this.truck = truck; + } + + public EBasic getBasic() { + return basic; + } + + public void setBasic(EBasic basic) { + this.basic = basic; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } +} diff --git a/src/test/java/org/tests/model/carwheeltruck/TTruckHolderItem.java b/src/test/java/org/tests/model/carwheeltruck/TTruckHolderItem.java new file mode 100644 index 000000000..1498b263a --- /dev/null +++ b/src/test/java/org/tests/model/carwheeltruck/TTruckHolderItem.java @@ -0,0 +1,49 @@ +package org.tests.model.carwheeltruck; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import java.util.UUID; + +@Entity +public class TTruckHolderItem { + + @Id + private Long id; + + private final UUID someUid; + + private final String foo; + + @ManyToOne(optional = false) + private TTruckHolder owner; + + public TTruckHolderItem(String foo) { + this.someUid = UUID.randomUUID(); + this.foo = foo; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public UUID getSomeUid() { + return someUid; + } + + public String getFoo() { + return foo; + } + + public TTruckHolder getOwner() { + return owner; + } + + public void setOwner(TTruckHolder owner) { + this.owner = owner; + } +} diff --git a/src/test/java/org/tests/model/carwheeltruck/TestMTOInheritNoDiscriminator.java b/src/test/java/org/tests/model/carwheeltruck/TestMTOInheritNoDiscriminator.java new file mode 100644 index 000000000..f353b2e34 --- /dev/null +++ b/src/test/java/org/tests/model/carwheeltruck/TestMTOInheritNoDiscriminator.java @@ -0,0 +1,54 @@ +package org.tests.model.carwheeltruck; + +import io.ebean.BaseTestCase; +import io.ebean.DB; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestMTOInheritNoDiscriminator extends BaseTestCase { + + @Test + public void test() { + + final TTruckHolder holder = setup(); + + LoggedSqlCollector.start(); + + final TTruckHolder found = DB.find(TTruckHolder.class) + .fetch("items") + .where().idEq(holder.getId()) + .findOne(); + + assertThat(found).isNotNull(); + assertThat(found.getItems()).hasSize(2); + assertThat(found.getItems()).extracting(TTruckHolderItem::getFoo).contains("a","b"); + + + final List sql = LoggedSqlCollector.stop(); + + assertThat(sql).hasSize(1); + if (isH2() || isPostgres()) { + assertThat(sql.get(0)).contains(" and t2.type = 'truck' "); + } + } + + private TTruckHolder setup() { + TTruck truck = new TTruck(); + truck.setPlateNo("J78"); + truck.setLoad(43L); + + DB.save(truck); + + TTruckHolder holder = new TTruckHolder("h1", truck); + holder.getItems().add(new TTruckHolderItem("a")); + holder.getItems().add(new TTruckHolderItem("b")); + + DB.save(holder); + + return holder; + } +}