From 1c224444c08abc5de5f8e58e4614945c5dfcf208 Mon Sep 17 00:00:00 2001 From: Noemi Szemenyei Date: Fri, 12 Nov 2021 10:40:15 +0100 Subject: [PATCH] Assume InfoInherit infoType when it has no children --- .../server/deploy/AssocOneHelpRefInherit.java | 14 ++++++++++---- .../org/tests/inheritance/bothsides/Target1.java | 1 - .../lazyforeignkeys/MainEntityRelation.java | 16 ++++++++++++++++ .../lazyforeignkeys/TestLazyForeignKeys.java | 16 +++++++++++++++- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java index 3a471f666..6ca843258 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/AssocOneHelpRefInherit.java @@ -31,10 +31,17 @@ final class AssocOneHelpRefInherit extends AssocOneHelp { Object read(DbReadContext ctx) throws SQLException { // read discriminator to determine the type InheritInfo rowInheritInfo = inherit.readType(ctx); + BeanDescriptor desc; if (rowInheritInfo == null) { - // ignore the id property - property.targetIdBinder.loadIgnore(ctx); - return null; + if(!inherit.hasChildren()) { + desc = inherit.desc(); + } else { + // ignore the id property + property.targetIdBinder.loadIgnore(ctx); + return null; + } + } else { + desc = rowInheritInfo.desc(); } Object id = property.targetIdBinder.read(ctx); if (id == null) { @@ -42,7 +49,6 @@ final class AssocOneHelpRefInherit extends AssocOneHelp { } // check transaction context to see if it already exists PersistenceContext pc = ctx.getPersistenceContext(); - BeanDescriptor desc = rowInheritInfo.desc(); Object existing = desc.contextGet(pc, id); if (existing != null) { return existing; diff --git a/ebean-test/src/test/java/org/tests/inheritance/bothsides/Target1.java b/ebean-test/src/test/java/org/tests/inheritance/bothsides/Target1.java index 5803d8046..f39c3ee61 100644 --- a/ebean-test/src/test/java/org/tests/inheritance/bothsides/Target1.java +++ b/ebean-test/src/test/java/org/tests/inheritance/bothsides/Target1.java @@ -4,7 +4,6 @@ import javax.persistence.Entity; import javax.persistence.Inheritance; @Entity -@Inheritance public class Target1 extends TargetBase { public Target1(String name) { diff --git a/ebean-test/src/test/java/org/tests/lazyforeignkeys/MainEntityRelation.java b/ebean-test/src/test/java/org/tests/lazyforeignkeys/MainEntityRelation.java index 5da5ffdbf..19d2bfd48 100644 --- a/ebean-test/src/test/java/org/tests/lazyforeignkeys/MainEntityRelation.java +++ b/ebean-test/src/test/java/org/tests/lazyforeignkeys/MainEntityRelation.java @@ -3,6 +3,9 @@ package org.tests.lazyforeignkeys; import io.ebean.annotation.DbForeignKey; import javax.persistence.*; + +import org.tests.model.basic.Cat; + import java.util.UUID; @@ -22,6 +25,11 @@ public class MainEntityRelation { @JoinColumn(name = "id2") @DbForeignKey(noConstraint = true) private MainEntity entity2; + + @ManyToOne + @JoinColumn(name = "cat_id") + @DbForeignKey(noConstraint = true) + private Cat cat; private String attr1; @@ -41,6 +49,14 @@ public class MainEntityRelation { this.entity2 = entity2; } + public Cat getCat() { + return cat; + } + + public void setCat(Cat cat) { + this.cat = cat; + } + public String getAttr1() { return attr1; } diff --git a/ebean-test/src/test/java/org/tests/lazyforeignkeys/TestLazyForeignKeys.java b/ebean-test/src/test/java/org/tests/lazyforeignkeys/TestLazyForeignKeys.java index 9d88e84ed..7fb3fcc05 100644 --- a/ebean-test/src/test/java/org/tests/lazyforeignkeys/TestLazyForeignKeys.java +++ b/ebean-test/src/test/java/org/tests/lazyforeignkeys/TestLazyForeignKeys.java @@ -8,6 +8,7 @@ import io.ebean.text.PathProperties; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.tests.model.basic.Cat; import java.util.List; @@ -56,7 +57,7 @@ public class TestLazyForeignKeys extends BaseTestCase { List sql = LoggedSql.stop(); assertThat(sql).hasSize(3); - assertSql(sql.get(0)).contains("select t0.id, t0.attr1, t0.id1, t0.id2 from main_entity_relation"); + assertSql(sql.get(0)).contains("select t0.id, t0.attr1, t0.id1, t0.id2, t1.species, t0.cat_id from main_entity_relation t0 left join animal t1 on t1.id = t0.cat_id"); if (isSqlServer() || isOracle()) { assertSql(sql.get(1)).contains("select t0.id, t0.attr1, t0.attr2, CASE WHEN t0.id is null THEN 1 ELSE 0 END from main_entity t0"); } else { @@ -86,4 +87,17 @@ public class TestLazyForeignKeys extends BaseTestCase { assertFalse(rel1.getEntity1().isDeleted()); assertTrue(rel1.getEntity2().isDeleted()); } + + @Test + public void testGetWithDbForeignKey() { + MainEntityRelation relation = DB.find(MainEntityRelation.class).findOne(); + Cat cat = new Cat(); + cat.setId(123L); + relation.setCat(cat); + DB.save(relation); + + relation = DB.find(MainEntityRelation.class).findOne(); + + assertNotNull(relation.getCat()); + } }