#225 - Mapping - Add / review support for @IdClass

This commit is contained in:
Rob Bygrave
2018-03-15 18:19:17 +13:00
parent 602a35d0b6
commit 4799c56e25
34 changed files with 765 additions and 309 deletions
@@ -367,7 +367,7 @@ public class TestMergeCustomer extends BaseTestCase {
private MContact addContact(String email, String first, String last) {
MContact mContact = new MContact(email, first, last);
int i = random.nextInt(2);
int i = 1 + random.nextInt(2);
for (int j = 0; j < i; j++) {
mContact.getMessages().add(new MContactMessage(first+" "+i, last+" "+i));
}
@@ -0,0 +1,53 @@
package org.tests.model.bridge;
import javax.persistence.Embeddable;
import java.util.Objects;
import java.util.UUID;
@Embeddable
public class BEmbId {
private UUID siteId;
private UUID userId;
public BEmbId(UUID siteId, UUID userId) {
this.siteId = siteId;
this.userId = userId;
}
public UUID getSiteId() {
return siteId;
}
public UUID getUserId() {
return userId;
}
@Override
public String toString() {
return "st:" + siteId + " ui:" + userId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BEmbId that = (BEmbId) o;
return Objects.equals(siteId, that.siteId) && Objects.equals(userId, that.userId);
}
@Override
public int hashCode() {
return Objects.hash(siteId, userId);
}
/**
* Just simulating the hash from Objects.hash(...)
*/
int otherHash() {
int result = 31 + siteId.hashCode();
result = 31 * result + userId.hashCode();
return result;
}
}
@@ -4,10 +4,12 @@ import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Version;
import java.util.Objects;
import java.util.UUID;
@Entity
public class BSiteUser {
public class BSiteUserA {
@Embeddable
public static class Id {
@@ -16,21 +18,23 @@ public class BSiteUser {
public UUID siteId;
public UUID userId;
public Id(UUID siteId, UUID userId) {
this.siteId = siteId;
this.userId = 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);
Id that = (Id) o;
return Objects.equals(siteId, that.siteId) && Objects.equals(userId, that.userId);
}
@Override
public int hashCode() {
int result = siteId.hashCode();
result = 31 * result + userId.hashCode();
return result;
return Objects.hash(siteId, userId);
}
}
@@ -45,8 +49,10 @@ public class BSiteUser {
@ManyToOne(optional = false)
private final BUser user;
@Version
private long version;
public BSiteUser(BAccessLevel accessLevel, BSite site, BUser user) {
public BSiteUserA(BAccessLevel accessLevel, BSite site, BUser user) {
this.accessLevel = accessLevel;
this.site = site;
this.user = user;
@@ -75,4 +81,12 @@ public class BSiteUser {
public void setAccessLevel(BAccessLevel accessLevel) {
this.accessLevel = accessLevel;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
}
@@ -0,0 +1,61 @@
package org.tests.model.bridge;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Version;
import java.util.UUID;
@Entity
@IdClass(BEmbId.class)
public class BSiteUserD {
@Id
private UUID siteId;
@Id
private UUID userId;
private BAccessLevel accessLevel;
@Version
private long version;
public BSiteUserD(BAccessLevel accessLevel, UUID siteId, UUID userId) {
this.accessLevel = accessLevel;
this.siteId = siteId;
this.userId = userId;
}
public UUID getSiteId() {
return siteId;
}
public void setSiteId(UUID siteId) {
this.siteId = siteId;
}
public UUID getUserId() {
return userId;
}
public void setUserId(UUID userId) {
this.userId = userId;
}
public BAccessLevel getAccessLevel() {
return accessLevel;
}
public void setAccessLevel(BAccessLevel accessLevel) {
this.accessLevel = accessLevel;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
}
@@ -0,0 +1,44 @@
package org.tests.model.bridge;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.ManyToOne;
@Entity
@IdClass(BEmbId.class)
public class BSiteUserE {
@Id
@ManyToOne
private final BSite site;
@Id
@ManyToOne
private final BUser user;
private BAccessLevel accessLevel;
public BSiteUserE(BAccessLevel accessLevel, BSite site, BUser user) {
this.accessLevel = accessLevel;
this.site = site;
this.user = user;
}
public BAccessLevel getAccessLevel() {
return accessLevel;
}
public BSite getSite() {
return site;
}
public BUser getUser() {
return user;
}
public void setAccessLevel(BAccessLevel accessLevel) {
this.accessLevel = accessLevel;
}
}
@@ -19,7 +19,7 @@ public class TestExplicitM2MBridgeTable extends BaseTestCase {
Ebean.save(user);
Ebean.save(site);
insertUpdateBridge(user, site);
insertUpdateBridgeA(user, site);
insertUpdateBridgeB(user, site);
insertUpdateBridgeC(user, site);
}
@@ -27,21 +27,26 @@ public class TestExplicitM2MBridgeTable extends BaseTestCase {
/**
* Test where matching by db column naming convention.
*/
private void insertUpdateBridge(BUser user, BSite site) {
private void insertUpdateBridgeA(BUser user, BSite site) {
BSiteUser access = new BSiteUser(BAccessLevel.ONE, site, user);
BSiteUserA access = new BSiteUserA(BAccessLevel.ONE, site, user);
Ebean.save(access);
access.setAccessLevel(BAccessLevel.TWO);
Ebean.save(access);
List<BSiteUser> list = Ebean.find(BSiteUser.class).findList();
List<BSiteUserA> list = Ebean.find(BSiteUserA.class).findList();
assertThat(list).isNotEmpty();
for (BSiteUser bridge : list) {
for (BSiteUserA bridge : list) {
assertThat(bridge.getId().siteId).isEqualTo(bridge.getSite().id);
assertThat(bridge.getId().userId).isEqualTo(bridge.getUser().id);
}
BSiteUserA found = Ebean.find(BSiteUserA.class, new BSiteUserA.Id(site.id, user.id));
found.setAccessLevel(BAccessLevel.THREE);
Ebean.save(found);
}
/**
@@ -0,0 +1,143 @@
package org.tests.model.bridge;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
import java.util.List;
import java.util.UUID;
import static org.assertj.core.api.Assertions.assertThat;
public class TestIdClassScalar extends BaseTestCase {
private BUser user = new BUser("Fiona");
private BSite site = new BSite("avaje.io");
@Test
public void testBEmbId_equalsHashcode() {
BEmbId a = new BEmbId(UUID.randomUUID(), UUID.randomUUID());
BEmbId b = new BEmbId(a.getSiteId(), a.getUserId());
BEmbId c = new BEmbId(UUID.randomUUID(), UUID.randomUUID());
BEmbId d = new BEmbId(a.getSiteId(), UUID.randomUUID());
assertThat(a).isEqualTo(b);
assertThat(a.hashCode()).isEqualTo(b.hashCode());
assertThat(a).isNotEqualTo(c);
assertThat(a.hashCode()).isNotEqualTo(c.hashCode());
assertThat(a).isNotEqualTo(d);
assertThat(a.hashCode()).isNotEqualTo(d.hashCode());
assertThat(a.hashCode()).isEqualTo(a.otherHash());
}
@Test
public void test() {
Ebean.save(user);
Ebean.save(site);
insertUpdateBridgeD(user, site);
insertUpdateBridgeE(user, site);
}
/**
* Test where matching by db column naming convention.
*/
private void insertUpdateBridgeD(BUser user, BSite site) {
LoggedSqlCollector.start();
BSiteUserD access = new BSiteUserD(BAccessLevel.ONE, site.id, user.id);
Ebean.save(access);
access.setAccessLevel(BAccessLevel.TWO);
Ebean.save(access);
List<BSiteUserD> list = Ebean.find(BSiteUserD.class).findList();
assertThat(list).isNotEmpty();
for (BSiteUserD bridge : list) {
assertThat(bridge.getSiteId()).isEqualTo(site.id);
assertThat(bridge.getUserId()).isEqualTo(user.id);
}
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("insert into bsite_user_d (site_id, user_id, access_level, version) values (?,?,?,?)");
assertThat(sql.get(1)).contains("update bsite_user_d set access_level=?, version=? where site_id=? and user_id=? and version=?");
assertThat(trimSql(sql.get(2))).contains("select t0.site_id, t0.user_id, t0.site_id, t0.user_id, t0.access_level, t0.version from bsite_user_d t0");
BEmbId id = new BEmbId(site.id, user.id);
BSiteUserD one = Ebean.find(BSiteUserD.class, id);
assertThat(one).isNotNull();
assertThat(one.getSiteId()).isEqualTo(site.id);
assertThat(one.getUserId()).isEqualTo(user.id);
one.setAccessLevel(BAccessLevel.THREE);
Ebean.save(one);
sql = LoggedSqlCollector.stop();
assertThat(sql).hasSize(2);
assertThat(trimSql(sql.get(0))).contains("select t0.site_id, t0.user_id, t0.site_id, t0.user_id, t0.access_level, t0.version from bsite_user_d t0 where t0.site_id = ? and t0.user_id = ?");
assertThat(sql.get(1)).contains("update bsite_user_d set access_level=?, version=? where site_id=? and user_id=? and version=?");
}
/**
* Test where matching by db column naming convention.
*/
private void insertUpdateBridgeE(BUser user, BSite site) {
LoggedSqlCollector.start();
BSiteUserE access = new BSiteUserE(BAccessLevel.ONE, site, user);
Ebean.save(access);
access.setAccessLevel(BAccessLevel.TWO);
Ebean.save(access);
List<BSiteUserE> list = Ebean.find(BSiteUserE.class).findList();
assertThat(list).isNotEmpty();
List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("insert into bsite_user_e (site_id, user_id, access_level)");
assertThat(sql.get(1)).contains("update bsite_user_e set access_level=? where site_id=? and user_id=?");
assertThat(trimSql(sql.get(2))).contains("select t0.site_id, t0.user_id, t0.access_level, t0.site_id, t0.user_id from bsite_user_e t0");
for (BSiteUserE bridge : list) {
assertThat(bridge.getSite().id).isEqualTo(site.id);
assertThat(bridge.getUser().id).isEqualTo(user.id);
}
BEmbId id = new BEmbId(site.id, user.id);
BSiteUserE one = Ebean.find(BSiteUserE.class, id);
assertThat(one).isNotNull();
assertThat(one.getSite().id).isEqualTo(site.id);
assertThat(one.getUser().id).isEqualTo(user.id);
one.setAccessLevel(BAccessLevel.THREE);
Ebean.save(one);
sql = LoggedSqlCollector.stop();
assertThat(sql).hasSize(2);
assertThat(trimSql(sql.get(0))).contains("select t0.site_id, t0.user_id, t0.access_level, t0.site_id, t0.user_id from bsite_user_e t0 where t0.site_id = ? and t0.user_id = ?");
assertThat(sql.get(1)).contains("update bsite_user_e set access_level=? where site_id=? and user_id=?");
}
}