#2476 - Failing test for element collection on bean with default constructor

This commit is contained in:
Rob Bygrave committed 2022-01-17 15:33:13 +13:00
1 parent f16f34f35f
commit 1c83bbe0b0
2 files changed
+161

No files matched your search

@@ -0,0 +1,61 @@
package org.tests.model.elementcollection;
import io.ebean.annotation.Cache;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Cache
@Entity
public class EcblPerson2 {
@Id
long id;
String name;
@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "person_id"))
List<EcPhone> phoneNumbers = new ArrayList<>();
@Version
long version;
@Override
public String toString() {
return "person id:" + id + " name:" + name + " phs:" + phoneNumbers;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<EcPhone> getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(List<EcPhone> phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
}
@@ -0,0 +1,100 @@
package org.tests.model.elementcollection;
import io.ebean.BaseTestCase;
import io.ebean.DB;
import io.ebean.test.LoggedSql;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class TestElementCollectionEmbeddedListCache2 extends BaseTestCase {
@Disabled
@Test
public void test() {
EcblPerson2 person = new EcblPerson2();
person.setName("CacheL");
person.getPhoneNumbers().add(new EcPhone("64", "021","1234"));
person.getPhoneNumbers().add(new EcPhone("64","021","4321"));
DB.save(person);
EcblPerson2 one = DB.find(EcblPerson2.class)
.setId(person.getId())
.fetch("phoneNumbers")
.findOne();
LoggedSql.start();
one.getPhoneNumbers().size();
List<String> sql = LoggedSql.collect();
assertThat(sql).isEmpty();
EcblPerson2 two = DB.find(EcblPerson2.class )
.setId(person.getId())
.findOne();
two.getPhoneNumbers().size();
assertThat(two.getPhoneNumbers().toString()).contains("64-021-1234", "64-021-4321");
sql = LoggedSql.collect();
assertThat(sql).isEmpty(); // cache hit
two.getPhoneNumbers().add(new EcPhone("61", "07", "11"));
two.getPhoneNumbers().remove(1);
DB.save(two);
sql = LoggedSql.collect();
if (isPersistBatchOnCascade()) {
assertThat(sql).hasSize(5); // update of collection only
assertSql(sql.get(0)).contains("delete from ecbl_person2_phone_numbers where person_id=?");
assertSqlBind(sql.get(1));
assertSql(sql.get(2)).contains("insert into ecbl_person2_phone_numbers (person_id,country_code,area,phnum) values (?,?,?,?)");
assertSqlBind(sql, 3, 4);
} else {
assertThat(sql).hasSize(3); // update of collection only
assertSql(sql.get(0)).contains("delete from ecbl_person2_phone_numbers where person_id=?");
assertSql(sql.get(1)).contains("insert into ecbl_person2_phone_numbers (person_id,country_code,area,phnum) values (?,?,?,?)");
assertSql(sql.get(2)).contains("insert into ecbl_person2_phone_numbers (person_id,country_code,area,phnum) values (?,?,?,?)");
}
EcblPerson2 three = DB.find(EcblPerson2.class )
.setId(person.getId())
.findOne();
assertThat(three.getPhoneNumbers().toString()).contains("61-07-11", "64-021-1234");
assertThat(three.getPhoneNumbers()).hasSize(2);
sql = LoggedSql.collect();
assertThat(sql).isEmpty(); // cache hit
three.setName("mod-3");
three.getPhoneNumbers().remove(0);
DB.save(three);
sql = LoggedSql.collect();
assertThat(sql).hasSize(5);
EcblPerson2 four = DB.find(EcblPerson2.class )
.setId(person.getId())
.findOne();
assertThat(four.getPhoneNumbers().toString()).contains("61-07-11");
assertThat(four.getPhoneNumbers()).hasSize(1);
DB.delete(four);
sql = LoggedSql.collect();
assertThat(sql).hasSize(2);
LoggedSql.stop();
}
}