#1834 - DDL for ElementCollection that is referenced multiple times includes foreign key constraint

This commit is contained in:
rob bygrave
2019-10-08 15:53:29 +13:00
parent 7bc6368f69
commit 5e7dda1ec8
9 changed files with 265 additions and 9 deletions
@@ -15,6 +15,51 @@ import static org.assertj.core.api.Assertions.assertThat;
public class ModelContainerTest {
@Test
public void elementCollectionTable_single_expect_foreignKeys() {
ModelContainer container = new ModelContainer();
container.addTableElementCollection(createElementCollectionTable("ec_bean.id", "fk_ec_bean_ec_table"));
final MTable ecTable = container.getTable("ec_table");
final MColumn fkCol = ecTable.getColumn("fk_col");
assertThat(fkCol.getReferences()).isEqualTo("ec_bean.id");
}
@Test
public void elementCollectionTable_reused_expect_noForeignKeys() {
ModelContainer container = new ModelContainer();
container.addTableElementCollection(createElementCollectionTable("ec_bean.id", "fk_ec_bean_ec_table"));
container.addTableElementCollection(createElementCollectionTable("ec_otherBean.id", "fk_ec_otherBean_ec_table"));
final MTable ecTable = container.getTable("ec_table");
final MColumn fkCol = ecTable.getColumn("fk_col");
assertThat(fkCol.getReferences()).isNull();
assertThat(fkCol.getForeignKeyName()).isNull();
final MIndex index = container.getIndex("ix_ec_table");
assertThat(index.getTableName()).isEqualTo("ec_table");
assertThat(index.getColumns()).containsOnly("fk_col");
}
private MTable createElementCollectionTable(String references, String fkName) {
MTable ecTable = new MTable("ec_table");
final MColumn colFk = new MColumn("fk_col", "varchar", true);
colFk.setReferences(references);
colFk.setForeignKeyName(fkName);
colFk.setForeignKeyIndex("ix_ec_table");
ecTable.addColumn(colFk);
ecTable.addColumn(new MColumn("key", "varchar", true));
ecTable.addColumn(new MColumn("val", "varchar", true));
return ecTable;
}
@Test
public void apply_when_noPendingDrops_then_emptyPending() {
@@ -0,0 +1,68 @@
package org.tests.model.elementcollection;
import javax.persistence.CollectionTable;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Version;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.UUID;
@Entity
public class EcsmOne {
@Id
UUID oneId;
String name;
@ElementCollection
@CollectionTable(name = "ecsm_values", joinColumns = @JoinColumn(name = "host_id", referencedColumnName = "one_id"))
Set<String> values = new LinkedHashSet<>();
@Version
long version;
public EcsmOne(String name) {
this.name = name;
}
@Override
public String toString() {
return "id:" + oneId + " name:" + name + " values:" + values;
}
public UUID getOneId() {
return oneId;
}
public void setOneId(UUID oneId) {
this.oneId = oneId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
public Set<String> getValues() {
return values;
}
public void setValues(Set<String> values) {
this.values = values;
}
}
@@ -0,0 +1,68 @@
package org.tests.model.elementcollection;
import javax.persistence.CollectionTable;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Version;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.UUID;
@Entity
public class EcsmTwo {
@Id
UUID id;
String name;
@ElementCollection
@CollectionTable(name = "ecsm_values", joinColumns = @JoinColumn(name = "host_id", referencedColumnName = "id"))
Set<String> values = new LinkedHashSet<>();
@Version
long version;
public EcsmTwo(String name) {
this.name = name;
}
@Override
public String toString() {
return "id:" + id + " name:" + name + " values:" + values;
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
public Set<String> getValues() {
return values;
}
public void setValues(Set<String> values) {
this.values = values;
}
}
@@ -0,0 +1,36 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class TestElementCollectionResused extends BaseTestCase {
@Test
public void insert_find_delete() {
EcsmOne one = new EcsmOne("One028");
one.getValues().add("128-1");
one.getValues().add("128-2");
EcsmTwo two = new EcsmTwo("Two028");
two.getValues().add("228-1");
two.getValues().add("228-2");
DB.save(one);
DB.save(two);
final EcsmOne foundOne = DB.find(EcsmOne.class, one.getOneId());
assertThat(foundOne.getName()).isEqualTo("One028");
assertThat(foundOne.getValues()).contains("128-1", "128-2");
final EcsmTwo foundTwo = DB.find(EcsmTwo.class, two.getId());
assertThat(foundTwo.getName()).isEqualTo("Two028");
assertThat(foundTwo.getValues()).contains("228-1", "228-2");
DB.delete(foundOne);
DB.delete(foundTwo);
}
}