From 1d1fde61bea44709c4ffbfda7b9c79df08541fc4 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Wed, 30 Aug 2017 21:58:33 +1200 Subject: [PATCH] #1101 - findNative() on a bean with an associated @OneToOne (with the PK being derived from the parent) maps incorrectly --- .../server/deploy/BeanDescriptor.java | 6 ++- .../org/tests/model/onetoone/OtoBChild.java | 46 +++++++++++++++++++ .../org/tests/model/onetoone/OtoBMaster.java | 43 +++++++++++++++++ .../TestOneToOneImportedPkNative.java | 34 ++++++++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/tests/model/onetoone/OtoBChild.java create mode 100644 src/test/java/org/tests/model/onetoone/OtoBMaster.java create mode 100644 src/test/java/org/tests/model/onetoone/TestOneToOneImportedPkNative.java diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index f3740e1b5..1bf56c671 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -713,7 +713,11 @@ public class BeanDescriptor implements MetaBeanInfo, BeanType { } void registerColumn(String dbColumn, String path) { - columnPath.put(dbColumn.toLowerCase(), path); + String key = dbColumn.toLowerCase(); + // check for clash with imported OneToOne PK + if (!columnPath.containsKey(key)) { + columnPath.put(key, path); + } } void registerTable(String baseTable, BeanPropertyAssoc assocProperty) { diff --git a/src/test/java/org/tests/model/onetoone/OtoBChild.java b/src/test/java/org/tests/model/onetoone/OtoBChild.java new file mode 100644 index 000000000..69603cf33 --- /dev/null +++ b/src/test/java/org/tests/model/onetoone/OtoBChild.java @@ -0,0 +1,46 @@ +package org.tests.model.onetoone; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToOne; +import javax.persistence.PrimaryKeyJoinColumn; + +@Entity +public class OtoBChild { + + @Id + @Column(name = "master_id") + Integer id; + + String child; + + @OneToOne + @PrimaryKeyJoinColumn(name = "master_id", referencedColumnName = "id") + OtoBMaster master; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getChild() { + return child; + } + + public void setChild(String child) { + this.child = child; + } + + public OtoBMaster getMaster() { + return master; + } + + public void setMaster(OtoBMaster master) { + this.master = master; + } + +} diff --git a/src/test/java/org/tests/model/onetoone/OtoBMaster.java b/src/test/java/org/tests/model/onetoone/OtoBMaster.java new file mode 100644 index 000000000..2ab81d97e --- /dev/null +++ b/src/test/java/org/tests/model/onetoone/OtoBMaster.java @@ -0,0 +1,43 @@ +package org.tests.model.onetoone; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToOne; + +@Entity +public class OtoBMaster { + + @Id + Long id; + + String name; + + @OneToOne(cascade = CascadeType.ALL, mappedBy = "master") + OtoBChild child; + + 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 OtoBChild getChild() { + return child; + } + + public void setChild(OtoBChild child) { + this.child = child; + } + +} diff --git a/src/test/java/org/tests/model/onetoone/TestOneToOneImportedPkNative.java b/src/test/java/org/tests/model/onetoone/TestOneToOneImportedPkNative.java new file mode 100644 index 000000000..b01c4ddb3 --- /dev/null +++ b/src/test/java/org/tests/model/onetoone/TestOneToOneImportedPkNative.java @@ -0,0 +1,34 @@ +package org.tests.model.onetoone; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import io.ebean.EbeanServer; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestOneToOneImportedPkNative extends BaseTestCase { + + @Test + public void native_with_o2oAndImportedPrimaryKey() { + + EbeanServer server = Ebean.getDefaultServer(); + server.find(OtoBMaster.class).delete(); + + OtoBMaster one = new OtoBMaster(); + one.setName("hello"); + Ebean.save(one); + + OtoBMaster m = server.findNative(OtoBMaster.class, "select * from oto_bmaster").findOne(); + + assertThat(m.getId()).isEqualTo(one.getId()); + assertThat(m.getName()).isEqualTo(one.getName()); + assertThat(m.getChild()).isNull(); + + OtoBMaster m2 = server.find(OtoBMaster.class, one.getId()); + assertThat(m2.getId()).isEqualTo(one.getId()); + assertThat(m2.getName()).isEqualTo(one.getName()); + assertThat(m2.getChild()).isNull(); + } + +}