Fixes for #94 - Additional API - added update(Collection beans); and insert(Collection beans); and #93 - ebean.properties defaultDeleteMissingChildren moved to updatesDeleteMissingChildren

This commit is contained in:
Rob Bygrave
2014-04-26 23:43:08 +12:00
parent e1ec0bcdfe
commit 1a13fc9742
19 changed files with 627 additions and 344 deletions
@@ -32,7 +32,7 @@ public class TestCKeyLazyLoad extends BaseTestCase {
p.add(new CKeyDetail("somethine one"));
p.add(new CKeyDetail("somethine two"));
Ebean.insert(p);
Ebean.save(p);
CKeyAssoc assoc2 = new CKeyAssoc();
assoc2.setAssocOne("assocTwo");
@@ -46,7 +46,7 @@ public class TestCKeyLazyLoad extends BaseTestCase {
p2.add(new CKeyDetail("somethine one"));
p2.add(new CKeyDetail("somethine two"));
Ebean.insert(p2);
Ebean.save(p2);
CKeyParentId searchId = new CKeyParentId(1, "one");
@@ -35,8 +35,8 @@ public class TestOnCascadeDeleteChildrenWithCompositeKeys extends BaseTestCase {
Ebean.delete(Ebean.find(User.class).findList());
// insert 2 User records
Ebean.insert(new User(1L));
Ebean.insert(new User(2L));
Ebean.save(new User(1L));
Ebean.save(new User(2L));
}
/**
@@ -3,6 +3,9 @@ package com.avaje.tests.inheritance;
import junit.framework.Assert;
import junit.framework.TestCase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.avaje.ebean.Ebean;
import com.avaje.tests.model.basic.AttributeHolder;
import com.avaje.tests.model.basic.ListAttribute;
@@ -10,7 +13,7 @@ import com.avaje.tests.model.basic.ListAttributeValue;
public class TestSkippable extends TestCase {
private static final Logger logger = LoggerFactory.getLogger(TestSkippable.class);
/**
* Test query.
@@ -18,8 +21,8 @@ public class TestSkippable extends TestCase {
* it was considered safe to skip as it didn't take into account any derived classes
* into account with e.g. collections and Cascade options </p>
*/
public void testQuery()
{
public void testQuery() {
// Setup the data first
final ListAttributeValue value1 = new ListAttributeValue();
final ListAttributeValue value2 = new ListAttributeValue();
@@ -30,20 +33,21 @@ public class TestSkippable extends TestCase {
final ListAttribute listAttribute = new ListAttribute();
listAttribute.add(value1);
Ebean.save(listAttribute);
logger.info(" -- seeded data");
final ListAttribute listAttributeDB = Ebean.find(ListAttribute.class, listAttribute.getId());
Assert.assertNotNull(listAttributeDB);
final ListAttributeValue value1_DB = listAttributeDB.getValues().iterator().next();
Assert.assertTrue(value1.getId().equals(value1_DB.getId()));
logger.info(" -- asserted data in db");
final AttributeHolder holder = new AttributeHolder();
holder.add(listAttributeDB);
Ebean.save(holder);
logger.info(" -- saved holder");
// Now change the M2M listAttribute.values and save the holder
// The save should cascade as follows
@@ -53,11 +57,11 @@ public class TestSkippable extends TestCase {
// Save the holder - should cascade down to the listAtribute and save the values
Ebean.save(holder);
logger.info(" -- M2M detected delete of value1 and add of value2 ?");
final ListAttribute listAttributeDB_2 = Ebean.find(ListAttribute.class, listAttributeDB.getId());
Assert.assertNotNull(listAttributeDB_2);
final ListAttributeValue value2_DB_2 = listAttributeDB_2.getValues().iterator().next();
@@ -0,0 +1,69 @@
package com.avaje.tests.insert;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.tests.model.basic.Customer;
public class TestInsertCollection extends BaseTestCase {
@Test
public void test() {
Customer cust1 = new Customer();
cust1.setName("jim");
Customer cust2 = new Customer();
cust2.setName("bob");
List<Customer> customers = new ArrayList<Customer>();
customers.add(cust1);
customers.add(cust2);
Ebean.insert(customers);
Assert.assertNotNull(cust1.getId());
Assert.assertNotNull(cust2.getId());
Customer cust1Check = Ebean.find(Customer.class, cust1.getId());
Assert.assertEquals(cust1.getName(), cust1Check.getName());
Customer cust2Check = Ebean.find(Customer.class, cust2.getId());
Assert.assertEquals(cust2.getName(), cust2Check.getName());
cust1.setName("jim-changed");
cust2.setName("bob-changed");
Ebean.update(customers);
Customer cust1Check2 = Ebean.find(Customer.class, cust1.getId());
Assert.assertEquals("jim-changed", cust1Check2.getName());
Customer cust2Check2 = Ebean.find(Customer.class, cust2.getId());
Assert.assertEquals("bob-changed", cust2Check2.getName());
cust1Check2.setName("jim-updated");
Customer cust3 = new Customer();
cust3.setName("mac");
List<Customer> saveList = new ArrayList<Customer>();
saveList.add(cust1Check2);
saveList.add(cust3);
Ebean.save(saveList);
Customer cust1Check3 = Ebean.find(Customer.class, cust1.getId());
Assert.assertEquals("jim-updated", cust1Check3.getName());
Customer cust3Check = Ebean.find(Customer.class, cust3.getId());
Assert.assertEquals("mac", cust3Check.getName());
}
}
@@ -80,12 +80,12 @@ public class ResetBasicData {
Country c = new Country();
c.setCode("NZ");
c.setName("New Zealand");
server.insert(c);
server.save(c);
Country au = new Country();
au.setCode("AU");
au.setName("Australia");
server.insert(au);
server.save(au);
}
});
}
@@ -99,25 +99,25 @@ public class ResetBasicData {
p.setId(1);
p.setName("Chair");
p.setSku("C001");
server.insert(p);
server.save(p);
p = new Product();
p.setId(2);
p.setName("Desk");
p.setSku("DSK1");
server.insert(p);
server.save(p);
p = new Product();
p.setId(3);
p.setName("Computer");
p.setSku("C002");
server.insert(p);
server.save(p);
p = new Product();
p.setId(4);
p.setName("Printer");
p.setSku("C003");
server.insert(p);
server.save(p);
}
});
}
@@ -2,6 +2,9 @@ package com.avaje.tests.update;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.junit.Assert;
import org.junit.Before;
@@ -251,4 +254,120 @@ public class TestStatelessUpdate extends BaseTestCase {
// maybe check if update instead of insert has been executed,
// currently "Unique index or primary key violation" PersistenceException is throwing
}
@Test
public void testStatelessRecursiveUpdateWithChangesInDetailOnly() {
// arrange
Contact contact1 = new Contact();
contact1.setLastName("contact1");
Contact contact2 = new Contact();
contact2.setLastName("contact2");
Customer customer = new Customer();
customer.setName("something");
customer.getContacts().add(contact1);
customer.getContacts().add(contact2);
server.save(customer);
// act
Contact updateContact1 = new Contact();
updateContact1.setId(contact1.getId());
updateContact1.setLastName("contact1-changed");
Contact updateContact3 = new Contact();
//updateContact3.setId(contact3.getId());
updateContact3.setLastName("contact3-added");
Customer updateCustomer = new Customer();
updateCustomer.setId(customer.getId());
updateCustomer.getContacts().add(updateContact1);
updateCustomer.getContacts().add(updateContact3);
// not adding contact2 so it will get deleted
//updateCustomer.getContacts().add(updateContact2);
server.update(updateCustomer);
// assert
Customer assCustomer = server.find(Customer.class, customer.getId());
List<Contact> assContacts = assCustomer.getContacts();
Assert.assertEquals(2, assContacts.size());
Set<Integer> ids = new LinkedHashSet<Integer>();
Set<String> names = new LinkedHashSet<String>();
for (Contact contact : assContacts) {
ids.add(contact.getId());
names.add(contact.getLastName());
}
Assert.assertTrue(ids.contains(contact1.getId()));
Assert.assertTrue(ids.contains(updateContact3.getId()));
Assert.assertFalse(ids.contains(contact2.getId()));
Assert.assertTrue(names.contains(updateContact1.getLastName()));
Assert.assertTrue(names.contains(updateContact3.getLastName()));
}
@Test
public void testStatelessRecursiveUpdateWithChangesInDetailOnlyAnd() {
// arrange
Contact contact1 = new Contact();
contact1.setLastName("contact1");
Contact contact2 = new Contact();
contact2.setLastName("contact2");
Customer customer = new Customer();
customer.setName("something");
customer.getContacts().add(contact1);
customer.getContacts().add(contact2);
server.save(customer);
// act
Contact updateContact1 = new Contact();
updateContact1.setId(contact1.getId());
updateContact1.setLastName("contact1-changed");
Contact updateContact3 = new Contact();
updateContact3.setLastName("contact3-added");
Customer updateCustomer = new Customer();
updateCustomer.setId(customer.getId());
updateCustomer.getContacts().add(updateContact1);
updateCustomer.getContacts().add(updateContact3);
// not adding contact2 but it won't be deleted in this case
boolean deleteMissingChildren = false;
server.update(updateCustomer, null, deleteMissingChildren);
// assert
Customer assCustomer = server.find(Customer.class, customer.getId());
List<Contact> assContacts = assCustomer.getContacts();
// contact 2 was not deleted this time
Assert.assertEquals(3, assContacts.size());
Set<Integer> ids = new LinkedHashSet<Integer>();
Set<String> names = new LinkedHashSet<String>();
for (Contact contact : assContacts) {
ids.add(contact.getId());
names.add(contact.getLastName());
}
Assert.assertTrue(ids.contains(contact1.getId()));
Assert.assertTrue(ids.contains(updateContact3.getId()));
Assert.assertTrue(ids.contains(contact2.getId()));
Assert.assertTrue(names.contains(updateContact1.getLastName()));
Assert.assertTrue(names.contains(contact2.getLastName()));
Assert.assertTrue(names.contains(updateContact3.getLastName()));
}
}