diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java
index 22eb69b27..40bb136c7 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java
@@ -2,6 +2,8 @@ package com.avaje.ebeaninternal.server.deploy;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Set;
import javax.persistence.PersistenceException;
@@ -23,7 +25,7 @@ import com.avaje.ebeaninternal.server.deploy.meta.DeployBeanDescriptor;
/**
* Helper that looks for methods annotated with lifecycle events and registers an adapter for them.
*
- * This includes PrePerist, PostPerist, PreUpdate, PostUpdate, PreRemove, PostRemove and PostLoad
+ * This includes PrePersist, PostPersist, PreUpdate, PostUpdate, PreRemove, PostRemove and PostLoad
* lifecycle events.
*
*/
@@ -38,7 +40,7 @@ public class BeanLifecycleAdapterFactory {
Method[] methods = deployDesc.getBeanType().getMethods();
- MethodHolder methodHolder = new MethodHolder();
+ MethodsHolder methodHolder = new MethodsHolder();
for (Method m : methods) {
methodHolder.checkMethod(m);
@@ -52,16 +54,16 @@ public class BeanLifecycleAdapterFactory {
/**
* Holds Methods for the lifecycle events.s
*/
- private static class MethodHolder {
+ private static class MethodsHolder {
private boolean hasListener;
- private Method preInsert;
- private Method postInsert;
- private Method preUpdate;
- private Method postUpdate;
- private Method preDelete;
- private Method postDelete;
- private Method postLoad;
+ private List preInserts = new ArrayList();
+ private List postInserts = new ArrayList();
+ private List preUpdates = new ArrayList();
+ private List postUpdates = new ArrayList();
+ private List preDeletes = new ArrayList();
+ private List postDeletes = new ArrayList();
+ private List postLoads = new ArrayList();
private boolean hasListener() {
return hasListener;
@@ -69,37 +71,36 @@ public class BeanLifecycleAdapterFactory {
private void checkMethod(Method method) {
if (method.isAnnotationPresent(PrePersist.class)) {
- preInsert = method;
+ preInserts.add(method);
hasListener = true;
}
if (method.isAnnotationPresent(PostPersist.class)) {
- postInsert = method;
+ postInserts.add(method);
hasListener = true;
}
if (method.isAnnotationPresent(PreUpdate.class)) {
- preUpdate = method;
+ preUpdates.add(method);
hasListener = true;
}
if (method.isAnnotationPresent(PostUpdate.class)) {
- postUpdate = method;
+ postUpdates.add(method);
hasListener = true;
}
if (method.isAnnotationPresent(PreRemove.class)) {
- preDelete = method;
+ preDeletes.add(method);
hasListener = true;
}
if (method.isAnnotationPresent(PostRemove.class)) {
- postDelete = method;
+ postDeletes.add(method);
hasListener = true;
}
if (method.isAnnotationPresent(PostLoad.class)) {
- postLoad = method;
+ postLoads.add(method);
hasListener = true;
}
-
}
}
@@ -108,9 +109,9 @@ public class BeanLifecycleAdapterFactory {
*/
private static class Adapter extends BeanPersistAdapter {
- private final MethodHolder methodHolder;
+ private final MethodsHolder methodHolder;
- private Adapter(MethodHolder methodHolder) {
+ private Adapter(MethodsHolder methodHolder) {
this.methodHolder = methodHolder;
}
@@ -130,61 +131,52 @@ public class BeanLifecycleAdapterFactory {
}
}
- private void invoke(Method method, BeanPersistRequest> request) {
- invoke(method, request.getBean());
+ private void invoke(List methods, BeanPersistRequest> request) {
+ if (methods.isEmpty()) return;
+ for (Method method : methods) {
+ invoke(method, request.getBean());
+ }
}
@Override
public boolean preDelete(BeanPersistRequest> request) {
- if (methodHolder.preDelete != null) {
- invoke(methodHolder.preDelete, request);
- }
+ invoke(methodHolder.preDeletes, request);
return true;
}
@Override
public boolean preInsert(BeanPersistRequest> request) {
- if (methodHolder.preInsert != null) {
- invoke(methodHolder.preInsert, request);
- }
+ invoke(methodHolder.preInserts, request);
return true;
}
@Override
public boolean preUpdate(BeanPersistRequest> request) {
- if (methodHolder.preUpdate != null) {
- invoke(methodHolder.preUpdate, request);
- }
+ invoke(methodHolder.preUpdates, request);
return true;
}
@Override
public void postDelete(BeanPersistRequest> request) {
- if (methodHolder.postDelete != null) {
- invoke(methodHolder.postDelete, request);
- }
+ invoke(methodHolder.postDeletes, request);
}
@Override
public void postInsert(BeanPersistRequest> request) {
- if (methodHolder.postInsert != null) {
- invoke(methodHolder.postInsert, request);
- }
+ invoke(methodHolder.postInserts, request);
}
@Override
public void postUpdate(BeanPersistRequest> request) {
- if (methodHolder.postUpdate != null) {
- invoke(methodHolder.postUpdate, request);
- }
+ invoke(methodHolder.postUpdates, request);
}
@Override
public void postLoad(Object bean, Set includedProperties) {
- if (methodHolder.postLoad != null) {
- invoke(methodHolder.postLoad, bean);
+ if (methodHolder.postLoads.isEmpty()) return;
+ for (Method method : methodHolder.postLoads) {
+ invoke(method, bean);
}
}
-
}
}
diff --git a/src/test/java/com/avaje/tests/lifecycle/TestLifecyleAnnotatedBean.java b/src/test/java/com/avaje/tests/lifecycle/TestLifecyleAnnotatedBean.java
index 6b9610fd8..90aec657b 100644
--- a/src/test/java/com/avaje/tests/lifecycle/TestLifecyleAnnotatedBean.java
+++ b/src/test/java/com/avaje/tests/lifecycle/TestLifecyleAnnotatedBean.java
@@ -1,5 +1,6 @@
package com.avaje.tests.lifecycle;
+import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
@@ -10,25 +11,95 @@ import com.avaje.tests.model.basic.EBasicWithLifecycle;
public class TestLifecyleAnnotatedBean extends BaseTestCase {
@Test
- public void test() {
-
+ public void shouldExecutePrePersistMethodsWhenSavingBean() {
EBasicWithLifecycle bean = new EBasicWithLifecycle();
- bean.setName("hello there");
-
+ bean.setName("PrePersist");
+
Ebean.getServerCacheManager();
Ebean.save(bean);
- Assert.assertEquals("prePersist,postPersist,", bean.getBuffer());
-
- EBasicWithLifecycle beanWasLoaded = Ebean.find(EBasicWithLifecycle.class, bean.getId());
- Assert.assertEquals("postLoad", beanWasLoaded.getBuffer().toString());
- bean.setName("Changed");
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("prePersist1"));
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("prePersist2"));
+ }
+
+ @Test
+ public void shouldExecutePostPersistMethodsWhenSavingBean() {
+ EBasicWithLifecycle bean = new EBasicWithLifecycle();
+ bean.setName("PostPersist");
+
+ Ebean.getServerCacheManager();
+ Ebean.save(bean);
+
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("postPersist1"));
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("postPersist2"));
+ }
+
+ @Test
+ public void shouldExecutePostLoadMethodsWhenFindingBean() {
+ EBasicWithLifecycle bean = new EBasicWithLifecycle();
+ bean.setName("PostLoad");
+
+ Ebean.getServerCacheManager();
+ Ebean.save(bean);
+
+ EBasicWithLifecycle loaded = Ebean.find(EBasicWithLifecycle.class, bean.getId());
+ Assert.assertThat(loaded.getBuffer(), Matchers.containsString("postLoad1"));
+ Assert.assertThat(loaded.getBuffer(), Matchers.containsString("postLoad2"));
+ }
+
+ @Test
+ public void shouldExecutePreUpdateMethodsWhenUpdatingBean() {
+ EBasicWithLifecycle bean = new EBasicWithLifecycle();
+ bean.setName("Persisted");
+
+ Ebean.getServerCacheManager();
Ebean.save(bean);
+ bean.setName("PreUpdate");
+ Ebean.save(bean);
+
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("preUpdate1"));
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("preUpdate2"));
+ }
+
+ @Test
+ public void shouldExecutePostUpdateMethodsWhenUpdatingBean() {
+ EBasicWithLifecycle bean = new EBasicWithLifecycle();
+ bean.setName("Persisted");
+
+ Ebean.getServerCacheManager();
+ Ebean.save(bean);
+
+ bean.setName("PostUpdate");
+ Ebean.save(bean);
+
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("postUpdate1"));
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("postUpdate2"));
+ }
+
+ @Test
+ public void shouldExecutePreRemoveMethodsWhenRemovingBean() {
+ EBasicWithLifecycle bean = new EBasicWithLifecycle();
+ bean.setName("Persisted");
+
+ Ebean.getServerCacheManager();
+ Ebean.save(bean);
Ebean.delete(bean);
-
- Assert.assertEquals("prePersist,postPersist,preUpdate,postUpdate,preRemove,postRemove", bean.getBuffer());
-
+
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("preRemove1"));
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("preRemove2"));
+ }
+
+ @Test
+ public void shouldExecutePostRemoveMethodsWhenRemovingBean() {
+ EBasicWithLifecycle bean = new EBasicWithLifecycle();
+ bean.setName("Persisted");
+
+ Ebean.getServerCacheManager();
+ Ebean.save(bean);
+ Ebean.delete(bean);
+
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("postRemove1"));
+ Assert.assertThat(bean.getBuffer(), Matchers.containsString("postRemove2"));
}
-
}
diff --git a/src/test/java/com/avaje/tests/model/basic/EBasicWithLifecycle.java b/src/test/java/com/avaje/tests/model/basic/EBasicWithLifecycle.java
index 1ea6067fe..645968341 100644
--- a/src/test/java/com/avaje/tests/model/basic/EBasicWithLifecycle.java
+++ b/src/test/java/com/avaje/tests/model/basic/EBasicWithLifecycle.java
@@ -27,38 +27,73 @@ public class EBasicWithLifecycle {
transient StringBuilder buffer = new StringBuilder();
@PrePersist
- public void prePersist() {
- buffer.append("prePersist,");
+ public void prePersist1() {
+ buffer.append("prePersist1");
+ }
+
+ @PrePersist
+ public void prePersist2() {
+ buffer.append("prePersist2");
}
@PostPersist
- public void postPersist() {
- buffer.append("postPersist,");
+ public void postPersist1() {
+ buffer.append("postPersist1");
+ }
+
+ @PostPersist
+ public void postPersist2() {
+ buffer.append("postPersist2");
}
@PreUpdate
- public void preUpdate() {
- buffer.append("preUpdate,");
+ public void preUpdate1() {
+ buffer.append("preUpdate1");
+ }
+
+ @PreUpdate
+ public void preUpdate2() {
+ buffer.append("preUpdate2");
}
@PostUpdate
- public void postUpdate() {
- buffer.append("postUpdate,");
+ public void postUpdate1() {
+ buffer.append("postUpdate1");
+ }
+
+ @PostUpdate
+ public void postUpdate2() {
+ buffer.append("postUpdate2");
+ }
+
+ @PreRemove
+ public void preRemove1() {
+ buffer.append("preRemove1");
}
@PreRemove
- public void preRemove() {
- buffer.append("preRemove,");
+ public void preRemove2() {
+ buffer.append("preRemove2");
}
@PostRemove
- public void postRemove() {
- buffer.append("postRemove");
+ public void postRemove1() {
+ buffer.append("postRemove1");
+ }
+
+ @PostRemove
+ public void postRemove2() {
+ buffer.append("postRemove2");
}
@PostLoad
- public void postLoad() {
- buffer.append("postLoad");
+ public void postLoad1() {
+ buffer.append("postLoad1");
+ }
+
+ @PostLoad
+ public void postLoad2() {
+ buffer.append("postLoad2");
}
public Long getId() {