diff --git a/src/test/java/com/avaje/tests/model/bridge/BAccessLevel.java b/src/test/java/com/avaje/tests/model/bridge/BAccessLevel.java new file mode 100644 index 000000000..8b20bce53 --- /dev/null +++ b/src/test/java/com/avaje/tests/model/bridge/BAccessLevel.java @@ -0,0 +1,10 @@ +package com.avaje.tests.model.bridge; + +/** + * Simple enum for our bridge table tests. + */ +public enum BAccessLevel { + ONE, + TWO, + THREE +} diff --git a/src/test/java/com/avaje/tests/model/bridge/BSite.java b/src/test/java/com/avaje/tests/model/bridge/BSite.java new file mode 100644 index 000000000..ebb034f42 --- /dev/null +++ b/src/test/java/com/avaje/tests/model/bridge/BSite.java @@ -0,0 +1,19 @@ +package com.avaje.tests.model.bridge; + +import javax.persistence.Entity; +import javax.persistence.Id; +import java.util.UUID; + +@Entity +public class BSite { + + @Id + UUID id; + + String name; + + public BSite(String name) { + this.name = name; + } + +} diff --git a/src/test/java/com/avaje/tests/model/bridge/BSiteUser.java b/src/test/java/com/avaje/tests/model/bridge/BSiteUser.java new file mode 100644 index 000000000..ca6dc221e --- /dev/null +++ b/src/test/java/com/avaje/tests/model/bridge/BSiteUser.java @@ -0,0 +1,78 @@ +package com.avaje.tests.model.bridge; + +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.ManyToOne; +import java.util.UUID; + +@Entity +public class BSiteUser { + + @Embeddable + public static class Id { + + // Use siteId, userId matching by db column naming convention + public UUID siteId; + public UUID userId; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Id id = (Id) o; + if (!siteId.equals(id.siteId)) return false; + return userId.equals(id.userId); + } + + @Override + public int hashCode() { + int result = siteId.hashCode(); + result = 31 * result + userId.hashCode(); + return result; + } + } + + @EmbeddedId + Id id; + + private BAccessLevel accessLevel; + + @ManyToOne(optional=false) + private final BSite site; + + @ManyToOne(optional=false) + private final BUser user; + + + public BSiteUser(BAccessLevel accessLevel, BSite site, BUser user) { + this.accessLevel = accessLevel; + this.site = site; + this.user = user; + } + + public Id getId() { + return id; + } + + public void setId(Id id) { + this.id = id; + } + + public BAccessLevel getAccessLevel() { + return accessLevel; + } + + public BSite getSite() { + return site; + } + + public BUser getUser() { + return user; + } + + public void setAccessLevel(BAccessLevel accessLevel) { + this.accessLevel = accessLevel; + } +} diff --git a/src/test/java/com/avaje/tests/model/bridge/BSiteUserB.java b/src/test/java/com/avaje/tests/model/bridge/BSiteUserB.java new file mode 100644 index 000000000..579feab35 --- /dev/null +++ b/src/test/java/com/avaje/tests/model/bridge/BSiteUserB.java @@ -0,0 +1,78 @@ +package com.avaje.tests.model.bridge; + +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.ManyToOne; +import java.util.UUID; + +@Entity +public class BSiteUserB { + + @Embeddable + public static class Id { + + // Use plain site and user matching by property name (not siteId, userId) + public UUID site; + public UUID user; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Id id = (Id) o; + if (!site.equals(id.site)) return false; + return user.equals(id.user); + } + + @Override + public int hashCode() { + int result = site.hashCode(); + result = 31 * result + user.hashCode(); + return result; + } + } + + @EmbeddedId + Id id; + + private BAccessLevel accessLevel; + + @ManyToOne(optional=false) + private final BSite site; + + @ManyToOne(optional=false) + private final BUser user; + + + public BSiteUserB(BAccessLevel accessLevel, BSite site, BUser user) { + this.accessLevel = accessLevel; + this.site = site; + this.user = user; + } + + public Id getId() { + return id; + } + + public void setId(Id id) { + this.id = id; + } + + public BAccessLevel getAccessLevel() { + return accessLevel; + } + + public BSite getSite() { + return site; + } + + public BUser getUser() { + return user; + } + + public void setAccessLevel(BAccessLevel accessLevel) { + this.accessLevel = accessLevel; + } +} diff --git a/src/test/java/com/avaje/tests/model/bridge/BSiteUserC.java b/src/test/java/com/avaje/tests/model/bridge/BSiteUserC.java new file mode 100644 index 000000000..35823447a --- /dev/null +++ b/src/test/java/com/avaje/tests/model/bridge/BSiteUserC.java @@ -0,0 +1,81 @@ +package com.avaje.tests.model.bridge; + +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import java.util.UUID; + +@Entity +public class BSiteUserC { + + @Embeddable + public static class Id { + + // matching by @JoinColumn (not naming convention or property name) + public UUID siteUid; + public UUID userUid; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Id id = (Id) o; + if (!siteUid.equals(id.siteUid)) return false; + return userUid.equals(id.userUid); + } + + @Override + public int hashCode() { + int result = siteUid.hashCode(); + result = 31 * result + userUid.hashCode(); + return result; + } + } + + @EmbeddedId + Id id; + + private BAccessLevel accessLevel; + + @ManyToOne(optional=false) + @JoinColumn(name = "site_uid", insertable = false, updatable = false) + private final BSite site; + + @ManyToOne(optional=false) + @JoinColumn(name = "user_uid", insertable = false, updatable = false) + private final BUser user; + + + public BSiteUserC(BAccessLevel accessLevel, BSite site, BUser user) { + this.accessLevel = accessLevel; + this.site = site; + this.user = user; + } + + public Id getId() { + return id; + } + + public void setId(Id id) { + this.id = id; + } + + public BAccessLevel getAccessLevel() { + return accessLevel; + } + + public BSite getSite() { + return site; + } + + public BUser getUser() { + return user; + } + + public void setAccessLevel(BAccessLevel accessLevel) { + this.accessLevel = accessLevel; + } +} diff --git a/src/test/java/com/avaje/tests/model/bridge/BUser.java b/src/test/java/com/avaje/tests/model/bridge/BUser.java new file mode 100644 index 000000000..0609046f5 --- /dev/null +++ b/src/test/java/com/avaje/tests/model/bridge/BUser.java @@ -0,0 +1,19 @@ +package com.avaje.tests.model.bridge; + +import javax.persistence.Entity; +import javax.persistence.Id; +import java.util.UUID; + +@Entity +public class BUser { + + @Id + UUID id; + + String name; + + public BUser(String name) { + this.name = name; + } + +} \ No newline at end of file diff --git a/src/test/java/com/avaje/tests/model/bridge/TestExplicitM2MBridgeTable.java b/src/test/java/com/avaje/tests/model/bridge/TestExplicitM2MBridgeTable.java new file mode 100644 index 000000000..642822b7c --- /dev/null +++ b/src/test/java/com/avaje/tests/model/bridge/TestExplicitM2MBridgeTable.java @@ -0,0 +1,86 @@ +package com.avaje.tests.model.bridge; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.Ebean; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestExplicitM2MBridgeTable extends BaseTestCase { + + @Test + public void test() { + + BUser user = new BUser("Rob"); + BSite site = new BSite("avaje.org"); + + Ebean.save(user); + Ebean.save(site); + + insertUpdateBridge(user, site); + insertUpdateBridgeB(user, site); + insertUpdateBridgeC(user, site); + } + + /** + * Test where matching by db column naming convention. + */ + private void insertUpdateBridge(BUser user, BSite site) { + + BSiteUser access = new BSiteUser(BAccessLevel.ONE, site, user); + Ebean.save(access); + + access.setAccessLevel(BAccessLevel.TWO); + Ebean.save(access); + + List list = Ebean.find(BSiteUser.class).findList(); + assertThat(list).isNotEmpty(); + + for (BSiteUser bridge : list) { + assertThat(bridge.getId().siteId).isEqualTo(bridge.getSite().id); + assertThat(bridge.getId().userId).isEqualTo(bridge.getUser().id); + } + } + + /** + * Test where matching by property name. + */ + private void insertUpdateBridgeB(BUser user, BSite site) { + + BSiteUserB access = new BSiteUserB(BAccessLevel.ONE, site, user); + Ebean.save(access); + + access.setAccessLevel(BAccessLevel.TWO); + Ebean.save(access); + + List list = Ebean.find(BSiteUserB.class).findList(); + assertThat(list).isNotEmpty(); + + for (BSiteUserB bridge : list) { + assertThat(bridge.getId().site).isEqualTo(bridge.getSite().id); + assertThat(bridge.getId().user).isEqualTo(bridge.getUser().id); + } + } + + /** + * Test where matching by explicit @JoinColumn. + */ + private void insertUpdateBridgeC(BUser user, BSite site) { + + BSiteUserC access = new BSiteUserC(BAccessLevel.ONE, site, user); + Ebean.save(access); + + access.setAccessLevel(BAccessLevel.TWO); + Ebean.save(access); + + List list = Ebean.find(BSiteUserC.class).findList(); + assertThat(list).isNotEmpty(); + + for (BSiteUserC bridge : list) { + assertThat(bridge.getId().siteUid).isEqualTo(bridge.getSite().id); + assertThat(bridge.getId().userUid).isEqualTo(bridge.getUser().id); + } + } +}