diff --git a/src/main/java/com/avaje/ebean/annotation/ChangeLog.java b/src/main/java/com/avaje/ebean/annotation/ChangeLog.java
index e5798cb4e..9fa699498 100644
--- a/src/main/java/com/avaje/ebean/annotation/ChangeLog.java
+++ b/src/main/java/com/avaje/ebean/annotation/ChangeLog.java
@@ -13,10 +13,13 @@ import java.lang.annotation.Target;
public @interface ChangeLog {
/**
- * Set this to true to exclude inserts on the associated bean type
- * from being included in the change log.
+ * Specify if inserts should be explicitly Included or Excluded.
+ *
+ * If not defined explicitly then the server default behaviour defined
+ * on ServerConfig is used.
+ *
*/
- boolean excludeInserts() default false;
+ ChangeLogInsertMode inserts() default ChangeLogInsertMode.DEFAULT;
/**
* When specified only include update requests that have at least one
diff --git a/src/main/java/com/avaje/ebean/annotation/ChangeLogInsertMode.java b/src/main/java/com/avaje/ebean/annotation/ChangeLogInsertMode.java
new file mode 100644
index 000000000..2cb17e9de
--- /dev/null
+++ b/src/main/java/com/avaje/ebean/annotation/ChangeLogInsertMode.java
@@ -0,0 +1,22 @@
+package com.avaje.ebean.annotation;
+
+/**
+ * The mode used to determine if inserts should be included or not for a given bean type.
+ */
+public enum ChangeLogInsertMode {
+
+ /**
+ * Use the default behaviour as defined on ServerConfig.
+ */
+ DEFAULT,
+
+ /**
+ * Include inserts in the change log.
+ */
+ INCLUDE,
+
+ /**
+ * Exclude inserts in the change log.
+ */
+ EXCLUDE
+}
diff --git a/src/main/java/com/avaje/ebean/config/ServerConfig.java b/src/main/java/com/avaje/ebean/config/ServerConfig.java
index 5dd492047..1cdc2290c 100644
--- a/src/main/java/com/avaje/ebean/config/ServerConfig.java
+++ b/src/main/java/com/avaje/ebean/config/ServerConfig.java
@@ -288,6 +288,11 @@ public class ServerConfig {
private List configStartupListeners = new ArrayList();
private List transactionEventListeners = new ArrayList();
+ /**
+ * By default inserts are included in the change log.
+ */
+ private boolean changeLogIncludeInserts = true;
+
private ChangeLogPrepare changeLogPrepare;
private ChangeLogListener changeLogListener;
@@ -706,6 +711,20 @@ public class ServerConfig {
this.changeLogRegister = changeLogRegister;
}
+ /**
+ * Return true if inserts should be included in the change log by default.
+ */
+ public boolean isChangeLogIncludeInserts() {
+ return changeLogIncludeInserts;
+ }
+
+ /**
+ * Set if inserts should be included in the change log by default.
+ */
+ public void setChangeLogIncludeInserts(boolean changeLogIncludeInserts) {
+ this.changeLogIncludeInserts = changeLogIncludeInserts;
+ }
+
/**
* Return the DB migration configuration.
*/
@@ -2054,6 +2073,7 @@ public class ServerConfig {
persistenceContextScope = PersistenceContextScope.valueOf(p.get("persistenceContextScope", "TRANSACTION"));
+ changeLogIncludeInserts = p.getBoolean("changeLogIncludeInserts", changeLogIncludeInserts);
expressionEqualsWithNullAsNoop = p.getBoolean("expressionEqualsWithNullAsNoop", expressionEqualsWithNullAsNoop);
diffFlatMode = p.getBoolean("diffFlatMode", diffFlatMode);
asOfViewSuffix = p.get("asOfViewSuffix", asOfViewSuffix);
diff --git a/src/main/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegister.java b/src/main/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegister.java
index af7968708..4d8d1d0da 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegister.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegister.java
@@ -1,6 +1,7 @@
package com.avaje.ebeaninternal.server.changelog;
import com.avaje.ebean.annotation.ChangeLog;
+import com.avaje.ebean.annotation.ChangeLogInsertMode;
import com.avaje.ebean.event.BeanPersistRequest;
import com.avaje.ebean.event.changelog.ChangeLogFilter;
import com.avaje.ebean.event.changelog.ChangeLogRegister;
@@ -17,6 +18,14 @@ public class DefaultChangeLogRegister implements ChangeLogRegister {
private static final BasicFilter EXCLUDE_INSERTS = new BasicFilter(false);
+ private final boolean defaultInsertsInclude;
+
+ /**
+ * Create with the default insertsIncluded from ServerConfig.
+ */
+ public DefaultChangeLogRegister(boolean defaultInsertsInclude) {
+ this.defaultInsertsInclude = defaultInsertsInclude;
+ }
@Override
public ChangeLogFilter getChangeFilter(Class> beanType) {
@@ -28,7 +37,7 @@ public class DefaultChangeLogRegister implements ChangeLogRegister {
String[] updatesThatInclude = changeLog.updatesThatInclude();
if (updatesThatInclude.length == 0) {
- return changeLog.excludeInserts() ? EXCLUDE_INSERTS : INCLUDE_INSERTS;
+ return insertModeInclude(changeLog.inserts()) ? INCLUDE_INSERTS : EXCLUDE_INSERTS;
}
Set updateProps = new HashSet();
@@ -36,7 +45,18 @@ public class DefaultChangeLogRegister implements ChangeLogRegister {
updateProps.add(updatesThatInclude[i]);
}
- return new UpdateFilter(!changeLog.excludeInserts(), updateProps);
+ return new UpdateFilter(insertModeInclude(changeLog.inserts()), updateProps);
+ }
+
+ /**
+ * Return true if inserts should be included in the change log.
+ */
+ private boolean insertModeInclude(ChangeLogInsertMode inserts) {
+ if (inserts == ChangeLogInsertMode.DEFAULT) {
+ // return the default as per the ServerConfig
+ return defaultInsertsInclude;
+ }
+ return ChangeLogInsertMode.INCLUDE == inserts;
}
/**
diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java
index b38230e55..f0b0e0b30 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java
@@ -180,7 +180,8 @@ public class InternalConfiguration {
* Return the ChangeLogRegister to use with a default implementation if none defined.
*/
public ChangeLogRegister changeLogRegister(ChangeLogRegister register) {
- return plugin((register != null) ? register : new DefaultChangeLogRegister());
+ boolean includeInserts = serverConfig.isChangeLogIncludeInserts();
+ return plugin((register != null) ? register : new DefaultChangeLogRegister(includeInserts));
}
/**
diff --git a/src/test/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegisterTest.java b/src/test/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegisterTest.java
index 85a10bf72..1db0c8400 100644
--- a/src/test/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegisterTest.java
+++ b/src/test/java/com/avaje/ebeaninternal/server/changelog/DefaultChangeLogRegisterTest.java
@@ -15,10 +15,11 @@ import static org.junit.Assert.assertTrue;
public class DefaultChangeLogRegisterTest extends BaseTestCase {
- DefaultChangeLogRegister register = new DefaultChangeLogRegister();
@Test
- public void test() {
+ public void test_defaultInsertTrue() {
+
+ DefaultChangeLogRegister register = new DefaultChangeLogRegister(true);
assertNull(register.getChangeFilter(Address.class));
@@ -27,13 +28,37 @@ public class DefaultChangeLogRegisterTest extends BaseTestCase {
assertFalse(updateFilter.includeInserts);
assertThat(updateFilter.updateProperties).containsExactly("name", "status");
+ changeFilter = register.getChangeFilter(Country.class);
+ DefaultChangeLogRegister.BasicFilter countryFilter = (DefaultChangeLogRegister.BasicFilter)changeFilter;
+ assertTrue(countryFilter.includeInserts);
+
+ // use default setting
changeFilter = register.getChangeFilter(Contact.class);
DefaultChangeLogRegister.BasicFilter contactFilter = (DefaultChangeLogRegister.BasicFilter)changeFilter;
assertTrue(contactFilter.includeInserts);
+ }
+
+ @Test
+ public void test_defaultInsertFalse() {
+
+ DefaultChangeLogRegister register = new DefaultChangeLogRegister(false);
+
+ assertNull(register.getChangeFilter(Address.class));
+
+ ChangeLogFilter changeFilter = register.getChangeFilter(Customer.class);
+ DefaultChangeLogRegister.UpdateFilter updateFilter = (DefaultChangeLogRegister.UpdateFilter)changeFilter;
+ assertFalse(updateFilter.includeInserts);
+ assertThat(updateFilter.updateProperties).containsExactly("name", "status");
+
changeFilter = register.getChangeFilter(Country.class);
DefaultChangeLogRegister.BasicFilter countryFilter = (DefaultChangeLogRegister.BasicFilter)changeFilter;
- assertFalse(countryFilter.includeInserts);
+ assertTrue(countryFilter.includeInserts);
+
+ // use default setting
+ changeFilter = register.getChangeFilter(Contact.class);
+ DefaultChangeLogRegister.BasicFilter contactFilter = (DefaultChangeLogRegister.BasicFilter)changeFilter;
+ assertFalse(contactFilter.includeInserts);
}
diff --git a/src/test/java/com/avaje/tests/model/basic/Country.java b/src/test/java/com/avaje/tests/model/basic/Country.java
index 499e54ab8..494dc5228 100644
--- a/src/test/java/com/avaje/tests/model/basic/Country.java
+++ b/src/test/java/com/avaje/tests/model/basic/Country.java
@@ -1,22 +1,23 @@
package com.avaje.tests.model.basic;
+import com.avaje.ebean.annotation.CacheStrategy;
+import com.avaje.ebean.annotation.CacheTuning;
+import com.avaje.ebean.annotation.ChangeLog;
+import com.avaje.ebean.annotation.ChangeLogInsertMode;
+
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Size;
-import com.avaje.ebean.annotation.CacheStrategy;
-import com.avaje.ebean.annotation.CacheTuning;
-import com.avaje.ebean.annotation.ChangeLog;
-
/**
* Country entity bean.
*/
-@ChangeLog(excludeInserts = true)
-@CacheStrategy(readOnly=true,warmingQuery="order by name")
-@CacheTuning(maxSize=500)
+@ChangeLog(inserts = ChangeLogInsertMode.INCLUDE)
+@CacheStrategy(readOnly = true, warmingQuery = "order by name")
+@CacheTuning(maxSize = 500)
@Entity
-@Table(name="o_country")
+@Table(name = "o_country")
public class Country {
@Id
diff --git a/src/test/java/com/avaje/tests/model/basic/Customer.java b/src/test/java/com/avaje/tests/model/basic/Customer.java
index 12ef8d2d1..2c45ed610 100644
--- a/src/test/java/com/avaje/tests/model/basic/Customer.java
+++ b/src/test/java/com/avaje/tests/model/basic/Customer.java
@@ -1,6 +1,7 @@
package com.avaje.tests.model.basic;
import com.avaje.ebean.annotation.ChangeLog;
+import com.avaje.ebean.annotation.ChangeLogInsertMode;
import com.avaje.ebean.annotation.EnumValue;
import com.avaje.ebean.annotation.JsonIgnore;
import com.avaje.ebean.annotation.Where;
@@ -21,7 +22,7 @@ import java.util.concurrent.locks.ReentrantLock;
/**
* Customer entity bean.
*/
-@ChangeLog(excludeInserts = true, updatesThatInclude = {"name","status"})
+@ChangeLog(inserts = ChangeLogInsertMode.EXCLUDE, updatesThatInclude = {"name","status"})
@Entity
@Table(name = "o_customer")
public class Customer extends BasicDomain {