diff --git a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java index a5e317ea3..e4b6d52d0 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationAssocManys.java @@ -304,6 +304,12 @@ class AnnotationAssocManys extends AnnotationParser { private void readJoinTable(JoinTable joinTable, DeployBeanPropertyAssocMany prop) { String intTableName = getFullTableName(joinTable); + if (intTableName.isEmpty()) { + BeanTable localTable = factory.getBeanTable(descriptor.getBeanType()); + BeanTable otherTable = factory.getBeanTable(prop.getTargetType()); + intTableName = getM2MJoinTableName(localTable, otherTable); + } + // set the intersection table DeployTableJoin intJoin = new DeployTableJoin(); intJoin.setTable(intTableName); diff --git a/src/test/java/org/tests/o2m/jointable/JtMonkeyGroup.java b/src/test/java/org/tests/o2m/jointable/JtMonkeyGroup.java new file mode 100644 index 000000000..496782f2b --- /dev/null +++ b/src/test/java/org/tests/o2m/jointable/JtMonkeyGroup.java @@ -0,0 +1,65 @@ +package org.tests.o2m.jointable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinTable; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.Version; +import java.util.List; + +@Entity +@Table(name="mkeygroup") +public class JtMonkeyGroup { + + @Id + long pid; + + String name; + + /** + * No cascading over to Monkey but we do maintain the join table regardless. + */ + @OneToMany + @JoinTable + List monkeys; + + @Version + long version; + + public JtMonkeyGroup(String name) { + this.name = name; + } + + public long getPid() { + return pid; + } + + public void setPid(long pid) { + this.pid = pid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getMonkeys() { + return monkeys; + } + + public void setMonkeys(List monkeys) { + this.monkeys = monkeys; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } +} diff --git a/src/test/java/org/tests/o2m/jointable/TestOneToManyJoinTableNoTableName.java b/src/test/java/org/tests/o2m/jointable/TestOneToManyJoinTableNoTableName.java new file mode 100644 index 000000000..dc8b93738 --- /dev/null +++ b/src/test/java/org/tests/o2m/jointable/TestOneToManyJoinTableNoTableName.java @@ -0,0 +1,72 @@ +package org.tests.o2m.jointable; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestOneToManyJoinTableNoTableName extends BaseTestCase { + + private JtMonkeyGroup troop = new JtMonkeyGroup("Pink"); + + private JtMonkey m0 = new JtMonkey("Sim3"); + private JtMonkey m1 = new JtMonkey("Tim3"); + private JtMonkey m2 = new JtMonkey("Uim3"); + + private void initialInsert() { + Ebean.saveAll(Arrays.asList(troop, m0, m1, m2)); + } + + @Test + public void base() { + + initialInsert(); + + LoggedSqlCollector.start(); + + // make m0 dirty ... but no cascade saved? + m0.setFoodPreference("camera"); + troop.getMonkeys().add(m0); + troop.getMonkeys().add(m1); + + Ebean.save(troop); + + List sql = LoggedSqlCollector.current(); + assertThat(sql).hasSize(1); + assertThat(sql.get(0)).contains("insert into mkeygroup_monkey (mkeygroup_pid, monkey_mid) values (?, ?)"); + + int intersectionRows = Ebean.createSqlQuery("select count(*) as total from mkeygroup_monkey where mkeygroup_pid = ?") + .setParameter(1, troop.getPid()) + .findOne() + .getInteger("total"); + + assertThat(intersectionRows).isEqualTo(2); + + LoggedSqlCollector.current(); + JtMonkeyGroup fetchTroop = Ebean.find(JtMonkeyGroup.class) + .fetch("monkeys") + .where().idEq(troop.getPid()) + .findOne(); + + assertThat(fetchTroop.getMonkeys()).hasSize(2); + + sql = LoggedSqlCollector.current(); + assertThat(sql).hasSize(1); + assertThat(trimSql(sql.get(0))).contains("from mkeygroup t0 left join mkeygroup_monkey t1z_ on t1z_.mkeygroup_pid = t0.pid left join monkey t1 on t1.mid = t1z_.monkey_mid where t0.pid = ?"); + assertThat(trimSql(sql.get(0))).contains("select t0.pid, t0.name, t0.version, t1.mid, t1.name, t1.food_preference, t1.version"); + + Ebean.delete(troop); + + sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(2); + assertThat(sql.get(0)).contains("delete from mkeygroup_monkey where mkeygroup_pid = ?"); + assertThat(sql.get(1)).contains("delete from mkeygroup where pid=? and version=?"); + + } + +}