Fix for #209 - refresh() ... does not refresh OneToMany or ManyToMany properties

This commit is contained in:
rbygrave
2014-11-25 23:40:21 +13:00
parent d5d6ac675b
commit 6a6cff2236
27 changed files with 618 additions and 727 deletions
@@ -1,12 +1,13 @@
package com.avaje.tests.batchload;
import org.junit.Assert;
import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.FetchConfig;
import com.avaje.tests.model.basic.Customer;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
public class TestSecondQueryNoRows extends BaseTestCase {
@@ -18,9 +19,13 @@ public class TestSecondQueryNoRows extends BaseTestCase {
Ebean.save(cnew);
Customer c = Ebean.find(Customer.class).setAutofetch(false).setId(cnew.getId())
.fetch("contacts", new FetchConfig().query()).findUnique();
Customer c = Ebean.find(Customer.class)
.setAutofetch(false)
.setId(cnew.getId())
.fetch("contacts", new FetchConfig().query())
.findUnique();
Assert.assertNotNull(c);
assertNotNull(c);
assertEquals(0, c.getContacts().size());
}
}
@@ -1,60 +0,0 @@
package com.avaje.tests.model.basic;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import junit.framework.TestCase;
import com.avaje.ebean.Ebean;
public class DMLTest extends TestCase {
public DMLTest() {
}
public static void main(String[] args) {
DMLTest dmlTest = new DMLTest();
dmlTest.deleteAll();
dmlTest.insertData();
}
public void test() {
Assert.assertTrue(true);
}
public void deleteAll() {
Ebean.beginTransaction();
try {
Ebean.createUpdate(Phone.class, "delete from phone").execute();
Ebean.createUpdate(Person.class, "delete from person").execute();
Ebean.commitTransaction();
} finally {
Ebean.endTransaction();
}
}
private void insertData() {
Person person = new Person();
person.setSurname("Kosinov");
person.setName("Yaroslav");
Phone phone = new Phone();
phone.setPhoneNumber("5244011");
List<Phone> phones = new ArrayList<Phone>();
phones.add(phone);
person.setPhones(phones);
Ebean.save(person);
person = new Person();
person.setSurname("Kosinov");
person.setName("Gennady");
phone = new Phone();
phone.setPhoneNumber("5712658");
phone.setPerson(person);
Ebean.save(phone);
}
}
@@ -1,16 +1,18 @@
package com.avaje.tests.query;
import java.util.List;
import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.FetchConfig;
import com.avaje.ebean.Query;
import com.avaje.tests.model.basic.Customer;
import com.avaje.tests.model.basic.Order;
import com.avaje.tests.model.basic.ResetBasicData;
import org.avaje.ebeantest.LoggedSqlCollector;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class TestQueryFilterMany extends BaseTestCase {
@@ -19,20 +21,23 @@ public class TestQueryFilterMany extends BaseTestCase {
ResetBasicData.reset();
Query<Customer> query = Ebean.find(Customer.class).fetch("orders", new FetchConfig().lazy())
.where().ilike("name", "Rob%").filterMany("orders").eq("status", Order.Status.NEW).where()
.gt("id", 0).query();
LoggedSqlCollector.start();
// query.filterMany("orders").eq("status", Order.Status.NEW);
Customer customer = Ebean.find(Customer.class)
.fetch("orders", new FetchConfig().lazy())
.filterMany("orders").eq("status", Order.Status.NEW)
.where().ieq("name", "Rob")
.order().asc("id").setMaxRows(1)
.findList().get(0);
List<Customer> list = query.findList();
for (Customer customer : list) {
customer.getOrders().size();
}
customer.getOrders().size();
Customer c0 = list.get(0);
System.out.println("......... refreshMany ...");
Ebean.refreshMany(c0, "orders");
List<String> sqlList = LoggedSqlCollector.stop();
assertEquals(2, sqlList.size());
assertTrue(sqlList.get(1).contains("status = ?"));
// Currently this does not include the query filter
Ebean.refreshMany(customer, "orders");
}
}
@@ -0,0 +1,88 @@
package com.avaje.tests.refresh;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.SqlRow;
import com.avaje.tests.model.basic.Contact;
import com.avaje.tests.model.basic.Customer;
import com.avaje.tests.model.basic.ResetBasicData;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertEquals;
public class TestRefreshWithMany extends BaseTestCase {
@Test
public void test() {
ResetBasicData.reset();
Customer customer = ResetBasicData.createCustomer("refresher", "22 refresh set", "23 fresh", 9);
Ebean.save(customer);
assertEquals(3, customer.getContacts().size());
int rc = Ebean.createSqlUpdate("update o_customer set name = :name where id = :id")
.setParameter("name", "ref-modified")
.setParameter("id", customer.getId())
.execute();
int rc2 = Ebean.createSqlUpdate("update contact set first_name = first_name || '-mod' where customer_id = :id")
.setParameter("id", customer.getId())
.execute();
assertEquals(1, rc);
assertEquals(3, rc2);
System.out.println("-------------------------- prior");
Ebean.refresh(customer);
System.out.println("-------------------------- after");
assertEquals("ref-modified", customer.getName());
assertEquals(3, customer.getContacts().size());
assertEquals(true, customer.getContacts().get(0).getFirstName().endsWith("-mod"));
// now try again when the bean is fully loaded
Customer customer1 = Ebean.find(Customer.class)
.fetch("contacts")
.setId(customer.getId())
.findUnique();
int rcb1 = Ebean.createSqlUpdate("update o_customer set name = :name where id = :id")
.setParameter("name", "ref-modified-again")
.setParameter("id", customer.getId())
.execute();
int rcb2 = Ebean.createSqlUpdate("update contact set first_name = :first, last_name='foo' where customer_id = :id")
.setParameter("id", customer.getId())
.setParameter("first","-alt")
.execute();
List<SqlRow> sqlRows = Ebean.createSqlQuery("select id, first_name, last_name from contact").findList();
for (SqlRow sqlRow : sqlRows) {
System.out.println("row: "+sqlRow.get("id")+" "+sqlRow.get("first_name")+" "+sqlRow.get("last_name"));
}
assertEquals(1, rcb1);
assertEquals(3, rcb2);
System.out.println("-------------------------- prior2");
Ebean.refresh(customer1);
System.out.println("-------------------------- after2");
assertEquals("ref-modified-again", customer1.getName());
System.out.println("-------------------------- after2a");
assertEquals(3, customer1.getContacts().size());
System.out.println("-------------------------- after2b");
for (Contact contact : customer1.getContacts()) {
System.out.println("hello "+contact.getId()+" "+contact.getFirstName()+" "+contact.getLastName());
}
assertEquals(true, customer1.getContacts().get(0).getFirstName().endsWith("-alt"));
}
}
@@ -2,6 +2,7 @@ package com.avaje.tests.text.csv;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.util.Locale;
import org.junit.Test;
@@ -20,7 +21,8 @@ public class TestCsvReader extends BaseTestCase {
ResetBasicData.reset();
try {
File f = new File("src/test/resources/test1.csv");
URL resource = TestCsvReaderWithCallback.class.getResource("/test1.csv");
File f = new File(resource.getFile());
FileReader reader = new FileReader(f);
@@ -2,6 +2,7 @@ package com.avaje.tests.text.csv;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.util.Locale;
import org.junit.Test;
@@ -21,7 +22,8 @@ public class TestCsvReaderWithCallback extends BaseTestCase {
ResetBasicData.reset();
File f = new File("src/test/resources/test1.csv");
URL resource = TestCsvReaderWithCallback.class.getResource("/test1.csv");
File f = new File(resource.getFile());
FileReader reader = new FileReader(f);
@@ -1,50 +0,0 @@
package com.avaje.tests.text.json;
import java.io.StringReader;
import java.util.List;
<<<<<<< HEAD
import java.util.Map;
=======
>>>>>>> json-refactor
import org.junit.Assert;
import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.text.json.JsonContext;
import com.avaje.tests.model.basic.Customer;
import com.avaje.tests.model.basic.ResetBasicData;
public class TestTextJsonBeanReadVisitor extends BaseTestCase {
@Test
public void test() {
ResetBasicData.reset();
List<Customer> list = Ebean.find(Customer.class)
.select("id, name, status, shippingAddress")
.fetch("billingAddress", "line1, city")
.fetch("billingAddress.country", "*")
.fetch("contacts", "firstName,email")
.order().desc("id").findList();
JsonContext json = Ebean.createJsonContext();
String s = json.toJsonString(list);
System.out.println(s);
List<Customer> mList = json.toList(Customer.class, s);
System.out.println("VIA STRING: " + mList);
StringReader reader = new StringReader(s);
List<Customer> mList2 = json.toList(Customer.class, reader);
System.out.println("VIA READER: " + mList2);
Assert.assertEquals(mList.size(), mList2.size());
}
}