mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
#225 - Mapping - Add / review support for @IdClass
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
+22
-8
@@ -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=?");
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user