changes, boolean updateNaturalKey, long version) {
ServerCache cache = getBeanCache();
- CachedBeanData existingData = (CachedBeanData) cache.get(id);
+ CachedBeanData existingData = (CachedBeanData) cache.get(key);
if (existingData != null) {
long currentVersion = existingData.getVersion();
if (version > 0 && version < currentVersion) {
if (beanLog.isDebugEnabled()) {
- beanLog.debug(" REMOVE {}({}) - version conflict old:{} new:{}", cacheName, id, currentVersion, version);
+ beanLog.debug(" REMOVE {}({}) - version conflict old:{} new:{}", cacheName, key, currentVersion, version);
}
- cache.remove(id);
+ cache.remove(key);
} else {
if (version == 0) {
version = currentVersion;
}
CachedBeanData newData = existingData.update(changes, version);
if (beanLog.isDebugEnabled()) {
- beanLog.debug(" UPDATE {}({}) changes:{}", cacheName, id, changes);
+ beanLog.debug(" UPDATE {}({}) changes:{}", cacheName, key, changes);
}
- cache.put(id, newData);
+ cache.put(key, newData);
}
if (updateNaturalKey) {
Object oldKey = calculateNaturalKey(existingData);
if (oldKey != null) {
if (natLog.isDebugEnabled()) {
- natLog.debug(".. update {} REMOVE({}) - old key for ({})", cacheName, oldKey, id);
+ natLog.debug(".. update {} REMOVE({}) - old key for ({})", cacheName, oldKey, key);
}
naturalKeyCache.remove(oldKey);
}
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java b/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java
index 6ae467d44..a2c7b0086 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanProperty.java
@@ -827,6 +827,13 @@ public class BeanProperty implements ElPropertyValue, Property, STreeProperty {
}
}
+ /**
+ * Return the value in String format (for bean cache key).
+ */
+ public String format(Object value) {
+ return scalarType.format(value);
+ }
+
/**
* Read the value for this property from L2 cache entry and set it to the bean.
*
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java
index bfba8ed9d..fdb38088c 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java
@@ -972,8 +972,10 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST
public void setCacheDataValue(EntityBean bean, Object cacheData, PersistenceContext context) {
try {
String asJson = (String) cacheData;
- Object collection = jsonReadCollection(asJson);
- setValue(bean, collection);
+ if (asJson != null && !asJson.isEmpty()) {
+ Object collection = jsonReadCollection(asJson);
+ setValue(bean, collection);
+ }
} catch (Exception e) {
logger.error("Error setting value from L2 cache", e);
}
@@ -999,7 +1001,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST
public String jsonWriteCollection(Object value) throws IOException {
StringWriter writer = new StringWriter(300);
SpiJsonWriter ctx = descriptor.createJsonWriter(writer);
- help.jsonWrite(ctx, null, value, false);
+ help.jsonWrite(ctx, null, value, true);
ctx.flush();
return writer.toString();
}
diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java
index 9a5f7c1c2..4245235cd 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocOne.java
@@ -413,6 +413,11 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc implements STr
}
}
+ @Override
+ public String format(Object value) {
+ return targetDescriptor.getIdBinder().cacheKey(value);
+ }
+
@Override
public void setCacheDataValue(EntityBean bean, Object cacheData, PersistenceContext context) {
if (cacheData == null) {
diff --git a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java
index d3a018e10..c722af79e 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinder.java
@@ -207,4 +207,10 @@ public interface IdBinder {
* Cast or convert the Id value if necessary.
*/
Object convertId(Object idValue);
+
+ /**
+ * Return a key to use for bean caches given the id value.
+ */
+ String cacheKey(Object idValue);
+
}
diff --git a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java
index c78e9ba25..6358a57c3 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmbedded.java
@@ -479,4 +479,20 @@ public final class IdBinderEmbedded implements IdBinder {
return idValue;
}
+
+ @Override
+ public String cacheKey(Object value) {
+
+ EntityBean bean = (EntityBean)value;
+ StringBuilder sb = new StringBuilder();
+ for (BeanProperty prop : props) {
+ Object val = prop.getValue(bean);
+ if (val != null) {
+ sb.append(prop.format(val));
+ }
+ sb.append("|");
+ }
+ return sb.toString();
+ }
+
}
diff --git a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java
index 01052b076..651c995d2 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderEmpty.java
@@ -178,4 +178,10 @@ public final class IdBinderEmpty implements IdBinder {
public void writeData(DataOutput dataOutput, Object idValue) throws IOException {
}
+
+ @Override
+ public String cacheKey(Object bean) {
+ return null;
+ }
+
}
diff --git a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java
index f424f4662..e76503b20 100644
--- a/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java
+++ b/src/main/java/io/ebeaninternal/server/deploy/id/IdBinderSimple.java
@@ -262,4 +262,10 @@ public final class IdBinderSimple implements IdBinder {
}
return idValue;
}
+
+ @Override
+ public String cacheKey(Object value) {
+ return scalarType.format(value);
+ }
+
}