From 66138e5ea23f5c0928873fa4d6c5f6425bc9eaf8 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 21 Jul 2017 23:31:23 +1200 Subject: [PATCH] #1070 Fix for - Create test for bean cache not being cleared with delete or update queries --- .../io/ebeaninternal/server/core/OrmQueryRequest.java | 11 +++++++++-- .../ebeaninternal/server/deploy/BeanDescriptor.java | 7 +++++++ .../server/deploy/BeanDescriptorCacheHelp.java | 7 +++++++ .../org/tests/cache/TestBeanCacheWithDeleteQuery.java | 8 ++++---- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java index 6a9816297..d083c7fe1 100644 --- a/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java @@ -301,7 +301,7 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe */ @Override public int delete() { - return queryEngine.delete(this); + return notifyCache(queryEngine.delete(this), false); } /** @@ -309,7 +309,14 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe */ @Override public int update() { - return queryEngine.update(this); + return notifyCache(queryEngine.update(this), true); + } + + private int notifyCache(int rows, boolean update) { + if (rows > 0 && beanDescriptor.isCaching()) { + transaction.getEvent().add(beanDescriptor.getBaseTable(), false, update, !update); + } + return rows; } /** diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 528133a45..cb4ec872a 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -1116,6 +1116,13 @@ public class BeanDescriptor implements MetaBeanInfo, BeanType { } } + /** + * Return true if there is bean or query caching for this type. + */ + public boolean isCaching() { + return cacheHelp.isCaching(); + } + /** * Return true if there is currently bean caching for this type of bean. */ diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java index b7d23ed67..dc9e2e2ec 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorCacheHelp.java @@ -155,6 +155,13 @@ final class BeanDescriptorCacheHelp { return beanCache != null; } + /** + * Return true if there is bean or query caching on this type. + */ + boolean isCaching() { + return beanCache != null || queryCache != null; + } + CacheOptions getCacheOptions() { return cacheOptions; } diff --git a/src/test/java/org/tests/cache/TestBeanCacheWithDeleteQuery.java b/src/test/java/org/tests/cache/TestBeanCacheWithDeleteQuery.java index d311e3a34..3c8a8c515 100644 --- a/src/test/java/org/tests/cache/TestBeanCacheWithDeleteQuery.java +++ b/src/test/java/org/tests/cache/TestBeanCacheWithDeleteQuery.java @@ -22,7 +22,7 @@ public class TestBeanCacheWithDeleteQuery extends BaseTestCase { public void testBeanCacheGetsClearedOnDelete() { OCachedBean bean = new OCachedBean(); - bean.setName("findById"); + bean.setName("cache-invalidation"); Ebean.save(bean); OCachedBean bean0 = Ebean.find(OCachedBean.class, bean.getId()); @@ -36,7 +36,7 @@ public class TestBeanCacheWithDeleteQuery extends BaseTestCase { assertThat(sql).isEmpty(); // delete the bean - int deleted = Ebean.createQuery(OCachedBean.class).delete(); + int deleted = Ebean.createQuery(OCachedBean.class).where().eq("name", "cache-invalidation").delete(); assertEquals(deleted, 1); @@ -52,7 +52,7 @@ public class TestBeanCacheWithDeleteQuery extends BaseTestCase { public void testBeanCacheGetsClearedOnUpdate() { OCachedBean bean = new OCachedBean(); - bean.setName("findById"); + bean.setName("cache-invalidation-upd"); Ebean.save(bean); OCachedBean bean0 = Ebean.find(OCachedBean.class, bean.getId()); @@ -66,7 +66,7 @@ public class TestBeanCacheWithDeleteQuery extends BaseTestCase { assertThat(sql).isEmpty(); // update the bean - int updated = Ebean.update(OCachedBean.class).set("name", "updatedName").where().update(); + int updated = Ebean.update(OCachedBean.class).set("name", "updatedName").where().eq("name","cache-invalidation-upd").update(); assertEquals(updated, 1);