mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
137 lines
4.4 KiB
Java
137 lines
4.4 KiB
Java
package org.tests.o2m.jointable;
|
|
|
|
import io.ebean.BaseTestCase;
|
|
import io.ebean.Ebean;
|
|
import io.ebean.annotation.PersistBatch;
|
|
|
|
import org.ebeantest.LoggedSqlCollector;
|
|
import org.junit.Test;
|
|
|
|
import java.util.Arrays;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
public class TestOneToManyJoinTable extends BaseTestCase {
|
|
|
|
private JtTroop troop = new JtTroop("Blue");
|
|
|
|
private JtMonkey m0 = new JtMonkey("Sim");
|
|
private JtMonkey m1 = new JtMonkey("Tim");
|
|
private JtMonkey m2 = new JtMonkey("Uim");
|
|
|
|
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("banana");
|
|
troop.getMonkeys().add(m0);
|
|
troop.getMonkeys().add(m1);
|
|
|
|
Ebean.save(troop);
|
|
|
|
List<String> sql = LoggedSqlCollector.current();
|
|
if (isPersistBatchOnCascade()) {
|
|
assertThat(sql).hasSize(1);
|
|
assertThat(sql.get(0)).contains("insert into troop_monkey (troop_pid, monkey_mid) values (?, ?)");
|
|
}
|
|
else {
|
|
assertThat(sql).hasSize(2);
|
|
assertThat(sql.get(0)).contains("insert into troop_monkey (troop_pid, monkey_mid) values (?, ?)");
|
|
assertThat(sql.get(1)).contains("insert into troop_monkey (troop_pid, monkey_mid) values (?, ?)");
|
|
}
|
|
|
|
int intersectionRows = Ebean.createSqlQuery("select count(*) as total from troop_monkey where troop_pid = ?")
|
|
.setParameter(1, troop.getPid())
|
|
.findOne()
|
|
.getInteger("total");
|
|
|
|
assertThat(intersectionRows).isEqualTo(2);
|
|
|
|
LoggedSqlCollector.current();
|
|
JtTroop fetchTroop = Ebean.find(JtTroop.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 troop t0 left join troop_monkey t1z_ on t1z_.troop_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 troop_monkey where troop_pid = ?");
|
|
assertThat(sql.get(1)).contains("delete from troop where pid=? and version=?");
|
|
|
|
|
|
insertWithCascade();
|
|
}
|
|
|
|
private void insertWithCascade() {
|
|
|
|
JtTrainer trainer = new JtTrainer("Frank");
|
|
|
|
// make m2 dirty ... cascades to an update on Uim
|
|
m2.setFoodPreference("Apple");
|
|
trainer.getMonkeys().add(m2);
|
|
trainer.getMonkeys().add(Ebean.getReference(JtMonkey.class, m1.getMid()));
|
|
trainer.getMonkeys().add(new JtMonkey("FAlp"));
|
|
trainer.getMonkeys().add(new JtMonkey("FBet"));
|
|
trainer.getMonkeys().add(new JtMonkey("FThe"));
|
|
|
|
LoggedSqlCollector.start();
|
|
Ebean.save(trainer);
|
|
|
|
List<String> sql = LoggedSqlCollector.current();
|
|
//Collections.sort(sql);
|
|
|
|
if (isPersistBatchOnCascade()) {
|
|
assertThat(sql).hasSize(6);
|
|
assertThat(sql.get(0)).contains("insert into trainer ");
|
|
assertThat(sql.get(1)).contains("insert into monkey ");
|
|
assertThat(sql.get(4)).contains("update monkey set name=?, food_preference=?, version=? where mid=? and version=?");
|
|
assertThat(sql.get(5)).contains("insert into trainer_monkey ");
|
|
}
|
|
else {
|
|
assertThat(sql).hasSize(10);
|
|
assertThat(sql.get(0)).contains("insert into trainer ");
|
|
assertThat(sql.get(1)).contains("update monkey set food_preference=?, version=? where mid=? and version=?");
|
|
assertThat(sql.get(2)).contains("insert into monkey ");
|
|
assertThat(sql.get(5)).contains("insert into trainer_monkey ");
|
|
assertThat(sql.get(9)).contains("insert into trainer_monkey ");
|
|
}
|
|
|
|
|
|
int intersectionRows = Ebean.createSqlQuery("select count(*) as total from trainer_monkey where trainer_tid = ?")
|
|
.setParameter(1, trainer.getTid())
|
|
.findOne()
|
|
.getInteger("total");
|
|
|
|
assertThat(intersectionRows).isEqualTo(5);
|
|
|
|
|
|
LoggedSqlCollector.current();
|
|
Ebean.delete(trainer);
|
|
|
|
sql = LoggedSqlCollector.stop();
|
|
assertThat(sql).hasSize(2);
|
|
assertThat(sql.get(0)).contains("delete from trainer_monkey where trainer_tid = ?");
|
|
assertThat(sql.get(1)).contains("delete from trainer where tid=?");
|
|
|
|
}
|
|
}
|