extends StringParser, StringFormatter, ScalarData
*/
boolean isDateTimeCapable();
+ /**
+ * Convert the value into a long version value.
+ */
+ long asVersion(T value);
+
/**
* Convert the systemTimeMillis into the appropriate java object.
*
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBase.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBase.java
index 648996605..b31731aef 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBase.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBase.java
@@ -17,6 +17,11 @@ public abstract class ScalarTypeBase implements ScalarType {
this.jdbcType = jdbcType;
}
+ @Override
+ public long asVersion(T value) {
+ throw new RuntimeException("not supported");
+ }
+
/**
* Default implementation of mutable false.
*/
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java
index f15c7eabd..fdb3bcbc2 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java
@@ -28,6 +28,11 @@ public abstract class ScalarTypeBaseDateTime extends ScalarTypeBase {
this.mode = mode;
}
+ @Override
+ public long asVersion(T value) {
+ return convertToMillis(value);
+ }
+
/**
* Convert the value to a Timestamp.
*/
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java
index 257fd9266..7cca1c9da 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java
@@ -24,6 +24,11 @@ public class ScalarTypeBytesEncrypted implements ScalarType {
this.dataEncryptSupport = dataEncryptSupport;
}
+ @Override
+ public long asVersion(byte[] value) {
+ throw new RuntimeException("not supported");
+ }
+
@Override
public boolean isMutable() {
return false;
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java
index 9cf74f6ba..997919141 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java
@@ -23,6 +23,11 @@ public class ScalarTypeEncryptedWrapper implements ScalarType {
this.dataEncryptSupport = dataEncryptSupport;
}
+ @Override
+ public long asVersion(T value) {
+ throw new RuntimeException("not supported");
+ }
+
@Override
public boolean isMutable() {
return wrapped.isMutable();
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java
index 0835881a5..41db357ca 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java
@@ -24,6 +24,11 @@ public class ScalarTypeEnumWithMapping extends ScalarTypeEnumStandard.EnumBase i
this.length = length;
}
+ @Override
+ public long asVersion(Object value) {
+ throw new RuntimeException("not supported");
+ }
+
/**
* Return the IN values for DB constraint construction.
*/
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java
index 52787032f..063406a81 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java
@@ -54,6 +54,11 @@ public class ScalarTypeInteger extends ScalarTypeBase {
}
}
+ @Override
+ public long asVersion(Integer value) {
+ return value.longValue();
+ }
+
@Override
public Object toJdbcType(Object value) {
return BasicTypeConverter.toInteger(value);
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java
index 9af0a8fb3..878326f54 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java
@@ -55,6 +55,11 @@ public class ScalarTypeLong extends ScalarTypeBase {
return Long.valueOf(value);
}
+ @Override
+ public long asVersion(Long value) {
+ return value;
+ }
+
@Override
public Long convertFromMillis(long systemTimeMillis) {
return systemTimeMillis;
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeWrapper.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeWrapper.java
index a75ce7e17..aaa1a957e 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeWrapper.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeWrapper.java
@@ -41,6 +41,12 @@ public class ScalarTypeWrapper implements ScalarType {
return "ScalarTypeWrapper " + wrapperType + " to " + scalarType.getType();
}
+ @Override
+ public long asVersion(B value) {
+ S unwrapValue = converter.unwrapValue(value);
+ return scalarType.asVersion(unwrapValue);
+ }
+
@Override
public boolean isMutable() {
return scalarType.isMutable();
diff --git a/src/test/java/com/avaje/ebean/BaseTestCase.java b/src/test/java/com/avaje/ebean/BaseTestCase.java
index cbc438435..1a1f3875b 100644
--- a/src/test/java/com/avaje/ebean/BaseTestCase.java
+++ b/src/test/java/com/avaje/ebean/BaseTestCase.java
@@ -31,6 +31,17 @@ public class BaseTestCase {
return spi.getDatabasePlatform().getName().equals("h2");
}
+ /**
+ * Wait for the L2 cache to propagate changes post-commit.
+ */
+ protected void awaitL2Cache() {
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
protected BeanDescriptor getBeanDescriptor(Class cls) {
return spiEbeanServer().getBeanDescriptor(cls);
}
diff --git a/src/test/java/com/avaje/ebeaninternal/server/cache/CacheBeanDataTest.java b/src/test/java/com/avaje/ebeaninternal/server/cache/CacheBeanDataTest.java
new file mode 100644
index 000000000..86af25558
--- /dev/null
+++ b/src/test/java/com/avaje/ebeaninternal/server/cache/CacheBeanDataTest.java
@@ -0,0 +1,119 @@
+package com.avaje.ebeaninternal.server.cache;
+
+import com.avaje.ebean.BaseTestCase;
+import com.avaje.ebean.bean.EntityBean;
+import com.avaje.ebeaninternal.api.SpiEbeanServer;
+import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
+import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocOne;
+import com.avaje.tests.model.basic.Address;
+import com.avaje.tests.model.basic.Country;
+import com.avaje.tests.model.basic.Customer;
+import com.avaje.tests.model.basic.Customer.Status;
+import com.avaje.tests.model.embedded.EAddress;
+import com.avaje.tests.model.embedded.EPerson;
+import org.junit.Test;
+
+import java.sql.Timestamp;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class CacheBeanDataTest extends BaseTestCase {
+
+ @Test
+ public void extract_load_on_customer() {
+
+ SpiEbeanServer server = spiEbeanServer();
+ BeanDescriptor desc = server.getBeanDescriptor(Customer.class);
+
+ Customer c = new Customer();
+ c.setId(98989);
+ c.setName("Rob");
+ c.setCretime(new Timestamp(System.currentTimeMillis()));
+ c.setUpdtime(new Timestamp(System.currentTimeMillis()));
+ c.setStatus(Status.ACTIVE);
+ c.setSmallnote("somenote");
+
+ Address billingAddress = new Address();
+ billingAddress.setId((short) 12);
+ billingAddress.setCity("Auckland");
+ billingAddress.setCountry(server.getReference(Country.class, "NZ"));
+ billingAddress.setLine1("92 Someplace Else");
+ c.setBillingAddress(billingAddress);
+
+ ((EntityBean) c)._ebean_getIntercept().setNewBeanForUpdate();
+
+ CachedBeanData cacheData = CachedBeanDataFromBean.extract(desc, (EntityBean) c);
+
+
+ assertNotNull(cacheData);
+
+ Customer newCustomer = new Customer();
+ newCustomer.setId(c.getId());
+ CachedBeanDataToBean.load(desc, (EntityBean) newCustomer, cacheData);
+
+ assertEquals(c.getId(), newCustomer.getId());
+ assertEquals(c.getName(), newCustomer.getName());
+ assertEquals(c.getStatus(), newCustomer.getStatus());
+ assertEquals(c.getSmallnote(), newCustomer.getSmallnote());
+ assertEquals(c.getCretime(), newCustomer.getCretime());
+ assertEquals(c.getUpdtime(), newCustomer.getUpdtime());
+ assertEquals(c.getBillingAddress().getId(), newCustomer.getBillingAddress().getId());
+
+ assertNotNull(newCustomer.getId());
+ assertNotNull(newCustomer.getName());
+ assertNotNull(newCustomer.getStatus());
+ assertNotNull(newCustomer.getSmallnote());
+ assertNotNull(newCustomer.getCretime());
+ assertNotNull(newCustomer.getUpdtime());
+ assertNotNull(newCustomer.getBillingAddress());
+ assertNotNull(newCustomer.getBillingAddress().getId());
+
+ }
+
+
+ @Test
+ public void extract_load_withEmbeddedBean() {
+
+ SpiEbeanServer server = spiEbeanServer();
+ BeanDescriptor desc = server.getBeanDescriptor(EPerson.class);
+ BeanPropertyAssocOne> addressBeanProperty = (BeanPropertyAssocOne>) desc.getBeanProperty("address");
+
+ EAddress address = new EAddress();
+ address.setStreet("92 Someplace Else");
+ address.setSuburb("Sandringham");
+ address.setCity("Auckland");
+
+ EPerson person = new EPerson();
+ person.setId(98989L);
+ person.setName("Rob");
+ person.setAddress(address);
+
+ CachedBeanData addressCacheData = (CachedBeanData) addressBeanProperty.getCacheDataValue((EntityBean) person);
+
+ EPerson newPersonCheck = new EPerson();
+ newPersonCheck.setId(98989L);
+ addressBeanProperty.setCacheDataValue((EntityBean) newPersonCheck, addressCacheData);
+
+ EAddress newAddress = newPersonCheck.getAddress();
+ assertEquals(address.getStreet(), newAddress.getStreet());
+ assertEquals(address.getCity(), newAddress.getCity());
+ assertEquals(address.getSuburb(), newAddress.getSuburb());
+
+
+ CachedBeanData cacheData = desc.cacheEmbeddedBeanExtract((EntityBean) person);
+
+ assertNotNull(cacheData);
+
+ EPerson newPerson = (EPerson)desc.cacheEmbeddedBeanLoad(cacheData);
+
+ assertNotNull(newPerson.getId());
+ assertNotNull(newPerson.getName());
+ assertNotNull(newPerson.getAddress());
+
+ assertEquals(person.getId(), newPerson.getId());
+ assertEquals(person.getName(), newPerson.getName());
+ assertEquals(person.getAddress().getStreet(), newPerson.getAddress().getStreet());
+ assertEquals(person.getAddress().getCity(), newPerson.getAddress().getCity());
+ }
+}
diff --git a/src/test/java/com/avaje/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java b/src/test/java/com/avaje/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java
new file mode 100644
index 000000000..7ef133f39
--- /dev/null
+++ b/src/test/java/com/avaje/ebeaninternal/server/cache/CachedBeanDataFromBeanTest.java
@@ -0,0 +1,60 @@
+package com.avaje.ebeaninternal.server.cache;
+
+import com.avaje.ebean.BaseTestCase;
+import com.avaje.ebean.bean.EntityBean;
+import com.avaje.ebeaninternal.api.SpiEbeanServer;
+import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
+import com.avaje.tests.model.basic.Address;
+import com.avaje.tests.model.basic.Car;
+import com.avaje.tests.model.basic.Customer;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class CachedBeanDataFromBeanTest extends BaseTestCase {
+
+ SpiEbeanServer server = spiEbeanServer();
+
+ @Test
+ public void extract() throws Exception {
+
+ BeanDescriptor desc = server.getBeanDescriptor(Customer.class);
+
+ Customer customer = new Customer();
+ customer.setId(42);
+ customer.setName("Rob");
+
+ Address billingAddress = new Address();
+ billingAddress.setId(Short.valueOf("12"));
+ billingAddress.setCity("SomePlace");
+
+ customer.setBillingAddress(billingAddress);
+
+ CachedBeanData cacheData = CachedBeanDataFromBean.extract(desc, (EntityBean) customer);
+
+ assertEquals(cacheData.getData("id"), Integer.valueOf(42));
+ assertEquals(cacheData.getData("name"), "Rob");
+ assertEquals(cacheData.getData("billingAddress"), Short.valueOf("12"));
+ }
+
+
+ @Test
+ public void inheritance() {
+
+ Car car = new Car();
+ car.setId(42);
+ car.setDriver("Jimmy");
+ car.setNotes("some notes");
+
+ BeanDescriptor carDesc = server.getBeanDescriptor(Car.class);
+ CachedBeanData cacheData = CachedBeanDataFromBean.extract(carDesc, (EntityBean) car);
+
+ Car newCar = new Car();
+ EntityBean entityBean = (EntityBean)newCar;
+ CachedBeanDataToBean.load(carDesc, entityBean, cacheData);
+
+ assertEquals(newCar.getId(), car.getId());
+ assertEquals(newCar.getDriver(), car.getDriver());
+ assertEquals(newCar.getNotes(), car.getNotes());
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/avaje/ebeaninternal/server/cache/TestCacheBeanData.java b/src/test/java/com/avaje/ebeaninternal/server/cache/TestCacheBeanData.java
deleted file mode 100644
index c23152f5c..000000000
--- a/src/test/java/com/avaje/ebeaninternal/server/cache/TestCacheBeanData.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.avaje.ebeaninternal.server.cache;
-
-import java.sql.Timestamp;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.avaje.ebean.BaseTestCase;
-import com.avaje.ebean.Ebean;
-import com.avaje.ebean.bean.EntityBean;
-import com.avaje.ebeaninternal.api.SpiEbeanServer;
-import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
-import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocOne;
-import com.avaje.tests.model.basic.Address;
-import com.avaje.tests.model.basic.Country;
-import com.avaje.tests.model.basic.Customer;
-import com.avaje.tests.model.basic.Customer.Status;
-import com.avaje.tests.model.embedded.EAddress;
-import com.avaje.tests.model.embedded.EPerson;
-
-public class TestCacheBeanData extends BaseTestCase {
-
- @Test
- public void testCacheBeanExtractAndLoad() {
-
- SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null);
- BeanDescriptor desc = server.getBeanDescriptor(Customer.class);
-
- Customer c = new Customer();
- c.setId(98989);
- c.setName("Rob");
- c.setCretime(new Timestamp(System.currentTimeMillis()));
- c.setUpdtime(new Timestamp(System.currentTimeMillis()));
- c.setStatus(Status.ACTIVE);
- c.setSmallnote("somenote");
-
- Address billingAddress = new Address();
- billingAddress.setId((short)12);
- billingAddress.setCity("Auckland");
- billingAddress.setCountry(server.getReference(Country.class, "NZ"));
- billingAddress.setLine1("92 Someplace Else");
- c.setBillingAddress(billingAddress);
-
- ((EntityBean)c)._ebean_getIntercept().setNewBeanForUpdate();
-
- CachedBeanData cacheData = CachedBeanDataFromBean.extract(desc, (EntityBean)c);
-
-
- Assert.assertNotNull(cacheData);
-
- Customer newCustomer = new Customer();
- newCustomer.setId(c.getId());
- CachedBeanDataToBean.load(desc, (EntityBean)newCustomer, cacheData);
-
- Assert.assertEquals(c.getId(), newCustomer.getId());
- Assert.assertEquals(c.getName(), newCustomer.getName());
- Assert.assertEquals(c.getStatus(), newCustomer.getStatus());
- Assert.assertEquals(c.getSmallnote(), newCustomer.getSmallnote());
- Assert.assertEquals(c.getCretime(), newCustomer.getCretime());
- Assert.assertEquals(c.getUpdtime(), newCustomer.getUpdtime());
- Assert.assertEquals(c.getBillingAddress().getId(), newCustomer.getBillingAddress().getId());
-
- Assert.assertNotNull(newCustomer.getId());
- Assert.assertNotNull(newCustomer.getName());
- Assert.assertNotNull(newCustomer.getStatus());
- Assert.assertNotNull(newCustomer.getSmallnote());
- Assert.assertNotNull(newCustomer.getCretime());
- Assert.assertNotNull(newCustomer.getUpdtime());
- Assert.assertNotNull(newCustomer.getBillingAddress());
- Assert.assertNotNull(newCustomer.getBillingAddress().getId());
-
- }
-
-
- @Test
- public void testCacheBeanExtractAndLoadWithEmbdedded() {
-
- SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null);
- BeanDescriptor desc = server.getBeanDescriptor(EPerson.class);
- BeanPropertyAssocOne> addressBeanProperty = (BeanPropertyAssocOne>)desc.getBeanProperty("address");
-
- EAddress address = new EAddress();
- address.setStreet("92 Someplace Else");
- address.setSuburb("Sandringham");
- address.setCity("Auckland");
-
- EPerson person = new EPerson();
- person.setId(98989L);
- person.setName("Rob");
- person.setAddress(address);
-
- CachedBeanData addressCacheData = (CachedBeanData)addressBeanProperty.getCacheDataValue((EntityBean) person);
-
- EPerson newPersonCheck = new EPerson();
- newPersonCheck.setId(98989L);
- addressBeanProperty.setCacheDataValue((EntityBean) newPersonCheck, addressCacheData);
-
- EAddress newAddress = newPersonCheck.getAddress();
- Assert.assertEquals(address.getStreet(), newAddress.getStreet());
- Assert.assertEquals(address.getCity(), newAddress.getCity());
- Assert.assertEquals(address.getSuburb(), newAddress.getSuburb());
-
-
-
-
- CachedBeanData cacheData = desc.cacheBeanExtractData((EntityBean)person);
-
- Assert.assertNotNull(cacheData);
-
- EPerson newPerson = new EPerson();
- desc.cacheBeanLoadData((EntityBean)newPerson, cacheData);
-
- Assert.assertNotNull(newPerson.getId());
- Assert.assertNotNull(newPerson.getName());
- Assert.assertNotNull(newPerson.getAddress());
-
- Assert.assertEquals(person.getId(), newPerson.getId());
- Assert.assertEquals(person.getName(), newPerson.getName());
- Assert.assertEquals(person.getAddress().getStreet(), newPerson.getAddress().getStreet());
- Assert.assertEquals(person.getAddress().getCity(), newPerson.getAddress().getCity());
-
- }
-}
diff --git a/src/test/java/com/avaje/tests/basic/TestDeleteByIdCollection.java b/src/test/java/com/avaje/tests/basic/TestDeleteByIdCollection.java
index 60167f2c4..a2e46d313 100644
--- a/src/test/java/com/avaje/tests/basic/TestDeleteByIdCollection.java
+++ b/src/test/java/com/avaje/tests/basic/TestDeleteByIdCollection.java
@@ -38,6 +38,7 @@ public class TestDeleteByIdCollection extends BaseTestCase {
Ebean.deleteAll(Customer.class, ids);
+ awaitL2Cache();
c0Back = Ebean.find(Customer.class, c0.getId());
c1Back = Ebean.find(Customer.class, "" + c1.getId());
@@ -67,6 +68,7 @@ public class TestDeleteByIdCollection extends BaseTestCase {
ids.add(order1.getId());
Ebean.deleteAll(Order.class, ids);
+ awaitL2Cache();
o0Back = Ebean.find(Order.class, order0.getId());
o1Back = Ebean.find(Order.class, order1.getId());
diff --git a/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java b/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java
index 46a172ac7..cc75fb239 100644
--- a/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java
+++ b/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java
@@ -67,6 +67,7 @@ public class TestCacheCollectionIds extends BaseTestCase {
newContact.setCustomer(customer);
Ebean.save(newContact);
+ awaitL2Cache();
int currentNumContacts2 = fetchCustomer(customer.getId());
Assert.assertEquals(currentNumContacts + 1, currentNumContacts2);
@@ -121,6 +122,7 @@ public class TestCacheCollectionIds extends BaseTestCase {
loadedBean.getCountries().add(Ebean.find(Country.class, "AU"));
Ebean.save(loadedBean);
+ awaitL2Cache();
// Get the data to assert/check against
OCachedBean result = Ebean.find(OCachedBean.class, cachedBean.getId());
@@ -169,6 +171,7 @@ public class TestCacheCollectionIds extends BaseTestCase {
loadedBean.getCountries().add(Ebean.find(Country.class, "AU"));
Ebean.save(loadedBean);
+ awaitL2Cache();
// Get the data to assert/check against
OCachedBean result = Ebean.find(OCachedBean.class, cachedBean.getId());
@@ -222,9 +225,9 @@ public class TestCacheCollectionIds extends BaseTestCase {
update.getCountries().add(Ebean.find(Country.class, "AU"));
Ebean.update(update);
-
+ awaitL2Cache();
+
Assert.assertEquals("countries entry still there (but updated)", 1, cachedBeanCountriesCache.size());
-
CachedManyIds cachedManyIds = (CachedManyIds) cachedBeanCountriesCache.get(update.getId());
diff --git a/src/test/java/com/avaje/tests/cache/TestCacheDelete.java b/src/test/java/com/avaje/tests/cache/TestCacheDelete.java
index f534d7fc1..90b0620b9 100644
--- a/src/test/java/com/avaje/tests/cache/TestCacheDelete.java
+++ b/src/test/java/com/avaje/tests/cache/TestCacheDelete.java
@@ -1,45 +1,44 @@
package com.avaje.tests.cache;
-import org.junit.Assert;
-import org.junit.Test;
-
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import com.avaje.tests.model.basic.OCachedBean;
import com.avaje.tests.model.basic.OCachedBeanChild;
+import org.junit.Assert;
+import org.junit.Test;
/**
* Test class testing deleting/invalidating of cached beans
*/
public class TestCacheDelete extends BaseTestCase {
- /**
- * When deleting a cached entity all entities with a referenced OneToMany relation must also be invalidated!
- */
- @Test
- public void testCacheDeleteOneToMany() {
- // arrange
- OCachedBeanChild child = new OCachedBeanChild();
- OCachedBeanChild child2 = new OCachedBeanChild();
+ /**
+ * When deleting a cached entity all entities with a referenced OneToMany relation must also be invalidated!
+ */
+ @Test
+ public void testCacheDeleteOneToMany() {
+ // arrange
+ OCachedBeanChild child = new OCachedBeanChild();
+ OCachedBeanChild child2 = new OCachedBeanChild();
- OCachedBean parentBean = new OCachedBean();
- parentBean.getChildren().add(child);
- parentBean.getChildren().add(child2);
- Ebean.save(parentBean);
+ OCachedBean parentBean = new OCachedBean();
+ parentBean.getChildren().add(child);
+ parentBean.getChildren().add(child2);
+ Ebean.save(parentBean);
- // confirm there are 2 children loaded from the parent
- Assert.assertEquals(2, Ebean.find(OCachedBean.class, parentBean.getId()).getChildren().size());
+ // confirm there are 2 children loaded from the parent
+ Assert.assertEquals(2, Ebean.find(OCachedBean.class, parentBean.getId()).getChildren().size());
- // ensure cache has been populated
- Ebean.find(OCachedBeanChild.class, child.getId());
- child2 = Ebean.find(OCachedBeanChild.class, child2.getId());
- parentBean = Ebean.find(OCachedBean.class, parentBean.getId());
+ // ensure cache has been populated
+ Ebean.find(OCachedBeanChild.class, child.getId());
+ child2 = Ebean.find(OCachedBeanChild.class, child2.getId());
+ parentBean = Ebean.find(OCachedBean.class, parentBean.getId());
- // act
- Ebean.delete(child2);
+ // act
+ Ebean.delete(child2);
+ awaitL2Cache();
- // assert
- OCachedBean beanFromCache = Ebean.find(OCachedBean.class, parentBean.getId());
- Assert.assertEquals(1, beanFromCache.getChildren().size());
- }
+ OCachedBean beanFromCache = Ebean.find(OCachedBean.class, parentBean.getId());
+ Assert.assertEquals(1, beanFromCache.getChildren().size());
+ }
}
diff --git a/src/test/java/com/avaje/tests/cache/TestCacheNaturalId.java b/src/test/java/com/avaje/tests/cache/TestCacheNaturalId.java
index 60d4d0be0..21727cd2a 100644
--- a/src/test/java/com/avaje/tests/cache/TestCacheNaturalId.java
+++ b/src/test/java/com/avaje/tests/cache/TestCacheNaturalId.java
@@ -1,16 +1,18 @@
package com.avaje.tests.cache;
-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.ebean.cache.ServerCache;
import com.avaje.ebean.cache.ServerCacheStatistics;
import com.avaje.tests.model.basic.Contact;
import com.avaje.tests.model.basic.ResetBasicData;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
public class TestCacheNaturalId extends BaseTestCase {
@@ -23,7 +25,7 @@ public class TestCacheNaturalId extends BaseTestCase {
List list = Ebean.find(Contact.class).setLoadBeanCache(true).findList();
- Assert.assertTrue(contactCache.size() > 0);
+ assertTrue(contactCache.size() > 0);
String emailToSearch = null;
for (Contact contact : list) {
@@ -43,24 +45,25 @@ public class TestCacheNaturalId extends BaseTestCase {
ServerCacheStatistics stats1 = contactCache.getStatistics(false);
- Assert.assertNotNull(c0);
- Assert.assertNotNull(c1);
+ assertNotNull(c0);
+ assertNotNull(c1);
- Assert.assertEquals(1, stats0.getHitCount());
- Assert.assertEquals(2, stats1.getHitCount());
+ assertEquals(1, stats0.getHitCount());
+ assertEquals(2, stats1.getHitCount());
c1.setEmail("mychangedemail@what.com");
Ebean.save(c1);
+ awaitL2Cache();
Contact c2 = Ebean.find(Contact.class).where().eq("email", "mychangedemail@what.com")
.findUnique();
ServerCacheStatistics stats2 = contactCache.getStatistics(false);
- Assert.assertNotNull(c2);
- Assert.assertEquals(c2.getId(), c1.getId());
- Assert.assertEquals(c0.getId(), c1.getId());
- Assert.assertTrue(stats2.getHitCount() > stats1.getHitCount());
+ assertNotNull(c2);
+ assertEquals(c2.getId(), c1.getId());
+ assertEquals(c0.getId(), c1.getId());
+ assertTrue(stats2.getHitCount() > stats1.getHitCount());
}
}
diff --git a/src/test/java/com/avaje/tests/cache/TestQueryCacheCountry.java b/src/test/java/com/avaje/tests/cache/TestQueryCacheCountry.java
index c1350529c..1765dd6d3 100644
--- a/src/test/java/com/avaje/tests/cache/TestQueryCacheCountry.java
+++ b/src/test/java/com/avaje/tests/cache/TestQueryCacheCountry.java
@@ -48,7 +48,8 @@ public class TestQueryCacheCountry extends BaseTestCase {
Country nz = Ebean.find(Country.class, "NZ");
nz.setName("New Zealandia");
Ebean.save(nz);
-
+ awaitL2Cache();
+
statistics = queryCache.getStatistics(false);
Assert.assertEquals(0, statistics.getSize());
diff --git a/src/test/java/com/avaje/tests/cache/TestQueryCacheInsert.java b/src/test/java/com/avaje/tests/cache/TestQueryCacheInsert.java
index 8a74e3e87..82ad9f308 100644
--- a/src/test/java/com/avaje/tests/cache/TestQueryCacheInsert.java
+++ b/src/test/java/com/avaje/tests/cache/TestQueryCacheInsert.java
@@ -1,14 +1,14 @@
package com.avaje.tests.cache;
-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.ebean.EbeanServer;
import com.avaje.tests.model.basic.EBasicVer;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
public class TestQueryCacheInsert extends BaseTestCase {
@@ -24,13 +24,10 @@ public class TestQueryCacheInsert extends BaseTestCase {
EBasicVer a2 = new EBasicVer();
server.save(a2);
+ awaitL2Cache();
List alist1 = server.find(EBasicVer.class).setUseQueryCache(true).findList();
- Assert.assertEquals(alist0.size() + 1, alist1.size());
- // List noQueryCacheList = server.find(EBasicVer.class)
- // .setUseQueryCache(false)
- // .findList();
- // Assert.assertTrue(sizeOne != noQueryCacheList.size());
+ assertEquals(alist0.size() + 1, alist1.size());
}
}
diff --git a/src/test/java/com/avaje/tests/inheritance/cache/TestInheritanceCache.java b/src/test/java/com/avaje/tests/inheritance/cache/TestInheritanceCache.java
new file mode 100644
index 000000000..9007f999a
--- /dev/null
+++ b/src/test/java/com/avaje/tests/inheritance/cache/TestInheritanceCache.java
@@ -0,0 +1,42 @@
+package com.avaje.tests.inheritance.cache;
+
+
+import com.avaje.ebean.BaseTestCase;
+import com.avaje.ebean.Ebean;
+import com.avaje.tests.model.basic.cache.CInhOne;
+import com.avaje.tests.model.basic.cache.CInhRoot;
+import org.junit.Test;
+
+import static org.assertj.core.api.StrictAssertions.assertThat;
+
+public class TestInheritanceCache extends BaseTestCase {
+
+ @Test
+ public void test() {
+
+ CInhOne one = new CInhOne();
+ one.setLicenseNumber("O12");
+ one.setDriver("Jimmy");
+ one.setNotes("Hello");
+
+ Ebean.save(one);
+
+ CInhRoot gotOne = Ebean.find(CInhRoot.class)
+ .setId(one.getId())
+ .findUnique();
+
+ assertThat(gotOne).isInstanceOf(CInhOne.class);
+
+ CInhRoot gotOneFromCache = Ebean.find(CInhRoot.class)
+ .setId(one.getId())
+ .findUnique();
+
+ assertThat(gotOneFromCache).isInstanceOf(CInhOne.class);
+
+ CInhRoot refOne = Ebean.getReference(CInhRoot.class, one.getId());
+ assertThat(refOne).isInstanceOf(CInhOne.class);
+
+ CInhRoot refOneSub = Ebean.getReference(CInhOne.class, one.getId());
+ assertThat(refOneSub).isNotNull();
+ }
+}
diff --git a/src/test/java/com/avaje/tests/insert/TestInsertCollection.java b/src/test/java/com/avaje/tests/insert/TestInsertCollection.java
index 5e1e41260..40b2fcc61 100644
--- a/src/test/java/com/avaje/tests/insert/TestInsertCollection.java
+++ b/src/test/java/com/avaje/tests/insert/TestInsertCollection.java
@@ -39,6 +39,7 @@ public class TestInsertCollection extends BaseTestCase {
cust2.setName("bob-changed");
Ebean.updateAll(customers);
+ awaitL2Cache();
Customer cust1Check2 = Ebean.find(Customer.class, cust1.getId());
Assert.assertEquals("jim-changed", cust1Check2.getName());
@@ -55,7 +56,8 @@ public class TestInsertCollection extends BaseTestCase {
saveList.add(cust3);
Ebean.saveAll(saveList);
-
+ awaitL2Cache();
+
Customer cust1Check3 = Ebean.find(Customer.class, cust1.getId());
Assert.assertEquals("jim-updated", cust1Check3.getName());
@@ -68,6 +70,7 @@ public class TestInsertCollection extends BaseTestCase {
deleteList.add(cust2Check2);
Ebean.deleteAll(deleteList);
+ awaitL2Cache();
Assert.assertNull(Ebean.find(Customer.class, cust1Check3.getId()));
Assert.assertNull(Ebean.find(Customer.class, cust2Check2.getId()));
diff --git a/src/test/java/com/avaje/tests/model/basic/cache/CInhOne.java b/src/test/java/com/avaje/tests/model/basic/cache/CInhOne.java
new file mode 100644
index 000000000..648315480
--- /dev/null
+++ b/src/test/java/com/avaje/tests/model/basic/cache/CInhOne.java
@@ -0,0 +1,34 @@
+package com.avaje.tests.model.basic.cache;
+
+import com.avaje.ebean.annotation.CacheStrategy;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+
+@CacheStrategy
+@Entity
+@Inheritance
+@DiscriminatorValue("O")
+public class CInhOne extends CInhRoot {
+
+ private String driver;
+
+ private String notes;
+
+ public String getDriver() {
+ return driver;
+ }
+
+ public void setDriver(String driver) {
+ this.driver = driver;
+ }
+
+ public String getNotes() {
+ return notes;
+ }
+
+ public void setNotes(String notes) {
+ this.notes = notes;
+ }
+}
diff --git a/src/test/java/com/avaje/tests/model/basic/cache/CInhRoot.java b/src/test/java/com/avaje/tests/model/basic/cache/CInhRoot.java
new file mode 100644
index 000000000..8563f13cf
--- /dev/null
+++ b/src/test/java/com/avaje/tests/model/basic/cache/CInhRoot.java
@@ -0,0 +1,25 @@
+package com.avaje.tests.model.basic.cache;
+
+import com.avaje.ebean.annotation.CacheStrategy;
+import com.avaje.tests.model.basic.BasicDomain;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+
+@CacheStrategy
+@Entity
+@Inheritance
+@DiscriminatorColumn(length = 3)
+public abstract class CInhRoot extends BasicDomain {
+
+ private String licenseNumber;
+
+ public String getLicenseNumber() {
+ return licenseNumber;
+ }
+
+ public void setLicenseNumber(String licenseNumber) {
+ this.licenseNumber = licenseNumber;
+ }
+}
diff --git a/src/test/java/com/avaje/tests/model/basic/cache/CInhTwo.java b/src/test/java/com/avaje/tests/model/basic/cache/CInhTwo.java
new file mode 100644
index 000000000..dbc1a1726
--- /dev/null
+++ b/src/test/java/com/avaje/tests/model/basic/cache/CInhTwo.java
@@ -0,0 +1,24 @@
+package com.avaje.tests.model.basic.cache;
+
+import com.avaje.ebean.annotation.CacheStrategy;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+
+@CacheStrategy
+@Entity
+@Inheritance
+@DiscriminatorValue("T")
+public class CInhTwo extends CInhRoot {
+
+ private String action;
+
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+}
diff --git a/src/test/java/com/avaje/tests/query/finder/TestCustomerFinder.java b/src/test/java/com/avaje/tests/query/finder/TestCustomerFinder.java
index cee2d916f..d956b9030 100644
--- a/src/test/java/com/avaje/tests/query/finder/TestCustomerFinder.java
+++ b/src/test/java/com/avaje/tests/query/finder/TestCustomerFinder.java
@@ -56,6 +56,7 @@ public class TestCustomerFinder extends BaseTestCase {
assertThat(customer.getName()).isEqualTo(customer2.getName());
Customer.find.deleteById(customer.getId());
+ awaitL2Cache();
Customer notThere = Customer.find.byId(customer.getId());
assertThat(notThere).isNull();
diff --git a/src/test/java/com/avaje/tests/update/TestJsonStatelessUpdate.java b/src/test/java/com/avaje/tests/update/TestJsonStatelessUpdate.java
index 532bd93d1..9678eb7f0 100644
--- a/src/test/java/com/avaje/tests/update/TestJsonStatelessUpdate.java
+++ b/src/test/java/com/avaje/tests/update/TestJsonStatelessUpdate.java
@@ -49,6 +49,7 @@ public class TestJsonStatelessUpdate extends BaseTestCase {
// as it thinks it should INSERT master rather than UPDATE master
Ebean.update(two2);
+ awaitL2Cache();
// confirm the properties where updated as expected
diff --git a/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java b/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java
index 02f20f74d..9c832c6cc 100644
--- a/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java
+++ b/src/test/java/com/avaje/tests/update/TestStatelessUpdate.java
@@ -23,19 +23,11 @@ import static org.junit.Assert.assertNull;
public class TestStatelessUpdate extends BaseTestCase {
- private EbeanServer server;
-
- @Before
- public void setUp() {
- server = Ebean.getServer(null);
- }
+ private EbeanServer server = server();
@Test
public void test() {
- // GlobalProperties.put("ebean.defaultUpdateNullProperties", "true");
- // GlobalProperties.put("ebean.defaultDeleteMissingChildren", "false");
-
EBasic e = new EBasic();
e.setName("something");
e.setStatus(Status.NEW);
diff --git a/src/test/java/com/avaje/tests/update/TestUpdatePartial.java b/src/test/java/com/avaje/tests/update/TestUpdatePartial.java
index 4d8b4749c..6c6215627 100644
--- a/src/test/java/com/avaje/tests/update/TestUpdatePartial.java
+++ b/src/test/java/com/avaje/tests/update/TestUpdatePartial.java
@@ -23,6 +23,7 @@ public class TestUpdatePartial extends BaseTestCase {
checkDbStatusValue(c.getId(), "A");
Customer c2 = Ebean.find(Customer.class)
+ .setUseCache(false)
.select("status, smallnote")
.setId(c.getId())
.findUnique();
@@ -34,6 +35,7 @@ public class TestUpdatePartial extends BaseTestCase {
checkDbStatusValue(c.getId(), "I");
Customer c3 = Ebean.find(Customer.class)
+ .setUseCache(false)
.select("status")
.setId(c.getId())
.findUnique();
@@ -58,17 +60,15 @@ public class TestUpdatePartial extends BaseTestCase {
*/
@Test
public void testWithoutChangesAndVersionColumn() {
- // arrange
+
Customer customer = new Customer();
customer.setName("something");
Ebean.save(customer);
- // act
Customer customerWithoutChanges = Ebean.find(Customer.class, customer.getId());
Ebean.save(customerWithoutChanges);
- // assert
assertEquals(customer.getUpdtime().getTime(), customerWithoutChanges.getUpdtime().getTime());
}
}
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
index c49f3fd5b..6fe757245 100644
--- a/src/test/resources/logback-test.xml
+++ b/src/test/resources/logback-test.xml
@@ -84,10 +84,10 @@
-
-
-
-
+
+
+
+