diff --git a/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java b/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java index f7637296d..70c43da8b 100644 --- a/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java +++ b/src/main/java/io/ebeaninternal/server/core/PersistRequestBean.java @@ -1399,7 +1399,8 @@ public final class PersistRequestBean extends PersistRequest implements BeanP changes.put(property.getName(), val); if (property.isNaturalKey()) { updateNaturalKey = true; - changeSet.addNaturalKeyPut(beanDescriptor, key, val.toString()); + String valStr = (val == null) ? null : val.toString(); + changeSet.addNaturalKeyPut(beanDescriptor, key, valStr); } } } diff --git a/src/test/java/org/tests/model/basic/cache/OCachedApp.java b/src/test/java/org/tests/model/basic/cache/OCachedApp.java index b903cf1a4..cdca746aa 100644 --- a/src/test/java/org/tests/model/basic/cache/OCachedApp.java +++ b/src/test/java/org/tests/model/basic/cache/OCachedApp.java @@ -10,7 +10,7 @@ import javax.persistence.UniqueConstraint; @UniqueConstraint(columnNames = "app_name") public class OCachedApp extends OCacheBase { - private final String appName; + private String appName; public OCachedApp(String appName) { this.appName = appName; @@ -19,4 +19,8 @@ public class OCachedApp extends OCacheBase { public String getAppName() { return appName; } + + public void setAppName(String appName) { + this.appName = appName; + } } diff --git a/src/test/java/org/tests/model/basic/cache/TestNatKeyCacheWhenNull.java b/src/test/java/org/tests/model/basic/cache/TestNatKeyCacheWhenNull.java new file mode 100644 index 000000000..13c8a299c --- /dev/null +++ b/src/test/java/org/tests/model/basic/cache/TestNatKeyCacheWhenNull.java @@ -0,0 +1,41 @@ +package org.tests.model.basic.cache; + +import io.ebean.BaseTestCase; +import io.ebean.DB; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestNatKeyCacheWhenNull extends BaseTestCase { + + public static final String WILL_CHANGE_TO_NULL = "WillChangeToNull"; + + @Test + public void updateToNull() { + + OCachedApp app = setup(); + + // act + app.setAppName(null); + app.save(); + + final OCachedApp foundAfter = DB.find(OCachedApp.class) + .where().eq("appName", WILL_CHANGE_TO_NULL) + .findOne(); + + assertThat(foundAfter).isNull(); + app.delete(); + } + + private OCachedApp setup() { + OCachedApp app = new OCachedApp(WILL_CHANGE_TO_NULL); + app.save(); + + final OCachedApp foundBefore = DB.find(OCachedApp.class) + .where().eq("appName", WILL_CHANGE_TO_NULL) + .findOne(); + + assertThat(foundBefore).isNotNull(); + return app; + } +}