diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareOwner.java b/ebean-api/src/main/java/io/ebean/ModifyAwareType.java similarity index 54% rename from ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareOwner.java rename to ebean-api/src/main/java/io/ebean/ModifyAwareType.java index 6d3b048d5..f846eecf4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareOwner.java +++ b/ebean-api/src/main/java/io/ebean/ModifyAwareType.java @@ -1,11 +1,9 @@ -package io.ebeaninternal.json; - -import java.io.Serializable; +package io.ebean; /** * Owner object notified when a modification is detected. */ -public interface ModifyAwareOwner extends Serializable { +public interface ModifyAwareType { /** * Return true if the value is considered dirty. @@ -16,11 +14,6 @@ public interface ModifyAwareOwner extends Serializable { /** * Marks the object as modified. */ - void markAsModified(); - - /** - * Reset the dirty state to clean. - */ - void resetMarkedDirty(); + void setMarkedDirty(boolean markedDirty); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java b/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java index 2b36f54f5..fa3451f8e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/EJsonReader.java @@ -3,6 +3,7 @@ package io.ebeaninternal.json; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; +import io.ebean.ModifyAwareType; import java.io.IOException; import java.io.Reader; @@ -145,7 +146,7 @@ class EJsonReader { currentContext = stack.pop(currentContext); } if (modifyAwareOwner != null) { - modifyAwareOwner.resetMarkedDirty(); + modifyAwareOwner.setMarkedDirty(false); } } @@ -296,7 +297,7 @@ class EJsonReader { map = new LinkedHashMap<>(); } - ObjectContext(ModifyAwareOwner owner) { + ObjectContext(ModifyAwareType owner) { map = new ModifyAwareMap<>(owner, new LinkedHashMap<>()); } @@ -334,7 +335,7 @@ class EJsonReader { values = new ArrayList<>(); } - ArrayContext(ModifyAwareOwner owner) { + ArrayContext(ModifyAwareType owner) { values = new ModifyAwareList<>(owner, new ArrayList<>()); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java index 45b6d9ab9..911675605 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareFlag.java @@ -1,28 +1,26 @@ package io.ebeaninternal.json; +import io.ebean.ModifyAwareType; + +import java.io.Serializable; + /** * Detects when content has been modified and as such needs to be persisted (included in an update). */ -public class ModifyAwareFlag implements ModifyAwareOwner { +public class ModifyAwareFlag implements ModifyAwareType, Serializable { private static final long serialVersionUID = 1; - boolean dirty; + private boolean markedDirty; @Override public boolean isMarkedDirty() { - if (!dirty) return false; - dirty = false; - return true; + return markedDirty; } @Override - public void markAsModified() { - dirty = true; + public void setMarkedDirty(boolean markedDirty) { + this.markedDirty = markedDirty; } - @Override - public void resetMarkedDirty() { - dirty = false; - } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java index 848395782..7e21e297f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareIterator.java @@ -1,5 +1,7 @@ package io.ebeaninternal.json; +import io.ebean.ModifyAwareType; + import java.util.Iterator; /** @@ -7,7 +9,7 @@ import java.util.Iterator; */ public class ModifyAwareIterator implements Iterator { - private final ModifyAwareOwner owner; + private final ModifyAwareType owner; private final Iterator it; @@ -17,7 +19,7 @@ public class ModifyAwareIterator implements Iterator { * The owner is notified of the removals. *

*/ - public ModifyAwareIterator(ModifyAwareOwner owner, Iterator it) { + public ModifyAwareIterator(ModifyAwareType owner, Iterator it) { this.owner = owner; this.it = it; } @@ -34,7 +36,7 @@ public class ModifyAwareIterator implements Iterator { @Override public void remove() { - owner.markAsModified(); + owner.setMarkedDirty(true); it.remove(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java index 197f02466..7803871df 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareList.java @@ -1,5 +1,8 @@ package io.ebeaninternal.json; +import io.ebean.ModifyAwareType; + +import java.io.Serializable; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashSet; @@ -10,20 +13,20 @@ import java.util.Objects; /** * Modify aware wrapper of a list. */ -public class ModifyAwareList implements List, ModifyAwareOwner { +public class ModifyAwareList implements List, ModifyAwareType, Serializable { private static final long serialVersionUID = 1; final List list; - final ModifyAwareOwner owner; + final ModifyAwareType owner; public ModifyAwareList(List list) { this.list = list; this.owner = new ModifyAwareFlag(); } - public ModifyAwareList(ModifyAwareOwner owner, List list) { + public ModifyAwareList(ModifyAwareType owner, List list) { this.list = list; this.owner = owner; } @@ -56,13 +59,12 @@ public class ModifyAwareList implements List, ModifyAwareOwner { } @Override - public void markAsModified() { - owner.markAsModified(); + public void setMarkedDirty(boolean markedDirty) { + owner.setMarkedDirty(markedDirty); } - @Override - public void resetMarkedDirty() { - owner.resetMarkedDirty(); + private void markAsDirty() { + owner.setMarkedDirty(true); } @Override @@ -98,13 +100,13 @@ public class ModifyAwareList implements List, ModifyAwareOwner { @Override public boolean add(E e) { - owner.markAsModified(); + markAsDirty(); return list.add(e); } @Override public boolean remove(Object o) { - owner.markAsModified(); + markAsDirty(); return list.remove(o); } @@ -115,31 +117,31 @@ public class ModifyAwareList implements List, ModifyAwareOwner { @Override public boolean addAll(Collection c) { - owner.markAsModified(); + markAsDirty(); return list.addAll(c); } @Override public boolean addAll(int index, Collection c) { - owner.markAsModified(); + markAsDirty(); return list.addAll(index, c); } @Override public boolean removeAll(Collection c) { - owner.markAsModified(); + markAsDirty(); return list.removeAll(c); } @Override public boolean retainAll(Collection c) { - owner.markAsModified(); + markAsDirty(); return list.retainAll(c); } @Override public void clear() { - owner.markAsModified(); + markAsDirty(); list.clear(); } @@ -150,19 +152,19 @@ public class ModifyAwareList implements List, ModifyAwareOwner { @Override public E set(int index, E element) { - owner.markAsModified(); + markAsDirty(); return list.set(index, element); } @Override public void add(int index, E element) { - owner.markAsModified(); + markAsDirty(); list.add(index, element); } @Override public E remove(int index) { - owner.markAsModified(); + markAsDirty(); return list.remove(index); } @@ -195,7 +197,6 @@ public class ModifyAwareList implements List, ModifyAwareOwner { * Create an return a modify aware Set. */ public ModifyAwareSet asSet() { - return new ModifyAwareSet<>(owner, new LinkedHashSet<>(list)); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java index 9b57442f3..5f6d5f013 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareListIterator.java @@ -1,5 +1,7 @@ package io.ebeaninternal.json; +import io.ebean.ModifyAwareType; + import java.util.ListIterator; /** @@ -7,11 +9,11 @@ import java.util.ListIterator; */ public class ModifyAwareListIterator implements ListIterator { - final ModifyAwareOwner owner; + final ModifyAwareType owner; final ListIterator iterator; - public ModifyAwareListIterator(ModifyAwareOwner owner, ListIterator iterator) { + public ModifyAwareListIterator(ModifyAwareType owner, ListIterator iterator) { this.owner = owner; this.iterator = iterator; } @@ -48,19 +50,19 @@ public class ModifyAwareListIterator implements ListIterator { @Override public void remove() { - owner.markAsModified(); + owner.setMarkedDirty(true); iterator.remove(); } @Override public void set(E e) { - owner.markAsModified(); + owner.setMarkedDirty(true); iterator.set(e); } @Override public void add(E e) { - owner.markAsModified(); + owner.setMarkedDirty(true); iterator.add(e); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java index 74eb81c87..9d5e1fffe 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java @@ -1,5 +1,8 @@ package io.ebeaninternal.json; +import io.ebean.ModifyAwareType; + +import java.io.Serializable; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Map; @@ -9,11 +12,11 @@ import java.util.Set; /** * Map that is wraps an underlying map for the purpose of detecting changes. */ -public class ModifyAwareMap implements Map, ModifyAwareOwner { +public class ModifyAwareMap implements Map, ModifyAwareType, Serializable { private static final long serialVersionUID = 1; - final ModifyAwareOwner owner; + final ModifyAwareType owner; /** * The underlying map. @@ -25,7 +28,7 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner { this.owner = new ModifyAwareFlag(); } - public ModifyAwareMap(ModifyAwareOwner owner, Map underlying) { + public ModifyAwareMap(ModifyAwareType owner, Map underlying) { this.owner = owner; this.map = underlying; } @@ -58,13 +61,12 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner { } @Override - public void markAsModified() { - owner.markAsModified(); + public void setMarkedDirty(boolean markedDirty) { + owner.setMarkedDirty(markedDirty); } - @Override - public void resetMarkedDirty() { - owner.resetMarkedDirty(); + private void markAsDirty() { + owner.setMarkedDirty(true); } @Override @@ -94,7 +96,7 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner { @Override public V put(K key, V value) { - markAsModified(); + markAsDirty(); return map.put(key, value); } @@ -102,14 +104,14 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner { public V remove(Object key) { V value = map.remove(key); if (value != null) { - markAsModified(); + markAsDirty(); } return value; } @Override public void putAll(Map m) { - markAsModified(); + markAsDirty(); map.putAll(m); } @@ -117,7 +119,7 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner { @Override public void clear() { if (!map.isEmpty()) { - markAsModified(); + markAsDirty(); } map.clear(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java index f80b16347..f20b39602 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java +++ b/ebean-core/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java @@ -1,5 +1,8 @@ package io.ebeaninternal.json; +import io.ebean.ModifyAwareType; + +import java.io.Serializable; import java.util.Collection; import java.util.Iterator; import java.util.Objects; @@ -8,11 +11,11 @@ import java.util.Set; /** * Wraps a Set for the purposes of detecting modifications. */ -public class ModifyAwareSet implements Set, ModifyAwareOwner { +public class ModifyAwareSet implements Set, ModifyAwareType, Serializable { private static final long serialVersionUID = 1; - protected final ModifyAwareOwner owner; + protected final ModifyAwareType owner; protected final Set set; @@ -26,7 +29,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner { /** * Create with an Owner that is notified of modifications. */ - public ModifyAwareSet(ModifyAwareOwner owner, Set underlying) { + public ModifyAwareSet(ModifyAwareType owner, Set underlying) { this.owner = owner; this.set = underlying; } @@ -37,16 +40,14 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner { } @Override - public void markAsModified() { - owner.markAsModified(); + public void setMarkedDirty(boolean markedDirty) { + owner.setMarkedDirty(markedDirty); } - @Override - public void resetMarkedDirty() { - owner.resetMarkedDirty(); + private void markAsDirty() { + owner.setMarkedDirty(true); } - @Override public String toString() { return set.toString(); @@ -72,7 +73,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner { @Override public boolean add(E o) { if (set.add(o)) { - owner.markAsModified(); + markAsDirty(); return true; } return false; @@ -83,7 +84,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner { boolean changed = false; for (E o : collection) { if (set.add(o)) { - owner.markAsModified(); + markAsDirty(); changed = true; } } @@ -93,7 +94,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner { @Override public void clear() { if (!set.isEmpty()) { - owner.markAsModified(); + markAsDirty(); } set.clear(); } @@ -121,7 +122,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner { @Override public boolean remove(Object o) { if (set.remove(o)) { - owner.markAsModified(); + markAsDirty(); return true; } return false; @@ -132,7 +133,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner { boolean changed = false; for (Object element : collection) { if (set.remove(element)) { - owner.markAsModified(); + markAsDirty(); changed = true; } } @@ -147,7 +148,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner { Object o = it.next(); if (!collection.contains(o)) { it.remove(); - owner.markAsModified(); + markAsDirty(); changed = true; } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/CheckMarkedDirty.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/CheckMarkedDirty.java new file mode 100644 index 000000000..321a35fec --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/CheckMarkedDirty.java @@ -0,0 +1,26 @@ +package io.ebeaninternal.server.type; + +import io.ebean.ModifyAwareType; + +/** + * Check dirty state of json value which might be modify aware. + */ +class CheckMarkedDirty { + + /** + * Return true if the value should be considered dirty (and included in an update). + */ + static boolean isDirty(Object value) { + if (value instanceof ModifyAwareType) { + ModifyAwareType modifyAware = (ModifyAwareType) value; + if (modifyAware.isMarkedDirty()) { + // reset the dirty state (consider not dirty after update) + modifyAware.setMarkedDirty(false); + return true; + } else { + return false; + } + } + return true; + } +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java index fbbd92855..a6c51ff05 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonCollection.java @@ -2,7 +2,6 @@ package io.ebeaninternal.server.type; import io.ebean.core.type.DataBinder; import io.ebean.core.type.DocPropertyType; -import io.ebeaninternal.json.ModifyAwareOwner; import java.io.DataInput; import java.io.DataOutput; @@ -62,7 +61,7 @@ abstract class ScalarTypeJsonCollection extends ScalarTypeBase implements */ @Override public boolean isDirty(Object value) { - return !(value instanceof ModifyAwareOwner) || ((ModifyAwareOwner) value).isMarkedDirty(); + return CheckMarkedDirty.isDirty(value); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java index 4d2b64b59..f0714c467 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonMap.java @@ -8,7 +8,6 @@ import io.ebean.core.type.DataReader; import io.ebean.core.type.DocPropertyType; import io.ebean.text.TextException; import io.ebean.text.json.EJson; -import io.ebeaninternal.json.ModifyAwareOwner; import java.io.DataInput; import java.io.DataOutput; @@ -124,7 +123,7 @@ public abstract class ScalarTypeJsonMap extends ScalarTypeBase { */ @Override public boolean isDirty(Object value) { - return !(value instanceof ModifyAwareOwner) || ((ModifyAwareOwner) value).isMarkedDirty(); + return CheckMarkedDirty.isDirty(value); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java index dfde0c334..fc88f10da 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypeJsonObjectMapper.java @@ -19,7 +19,6 @@ import io.ebean.core.type.ScalarType; import io.ebean.text.TextException; import io.ebeaninternal.json.ModifyAwareList; import io.ebeaninternal.json.ModifyAwareMap; -import io.ebeaninternal.json.ModifyAwareOwner; import io.ebeaninternal.json.ModifyAwareSet; import javax.persistence.PersistenceException; @@ -200,7 +199,7 @@ public class ScalarTypeJsonObjectMapper { */ @Override public boolean isDirty(Object value) { - return !(value instanceof ModifyAwareOwner) || ((ModifyAwareOwner) value).isMarkedDirty(); + return CheckMarkedDirty.isDirty(value); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePostgresHstore.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePostgresHstore.java index 1d0451247..810504411 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePostgresHstore.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/ScalarTypePostgresHstore.java @@ -9,7 +9,6 @@ import io.ebean.core.type.DocPropertyType; import io.ebean.text.TextException; import io.ebean.text.json.EJson; import io.ebeaninternal.json.ModifyAwareMap; -import io.ebeaninternal.json.ModifyAwareOwner; import java.io.DataInput; import java.io.DataOutput; @@ -34,7 +33,7 @@ public class ScalarTypePostgresHstore extends ScalarTypeBase { @Override public boolean isDirty(Object value) { - return !(value instanceof ModifyAwareOwner) || ((ModifyAwareOwner) value).isMarkedDirty(); + return CheckMarkedDirty.isDirty(value); } @SuppressWarnings("unchecked") diff --git a/ebean-core/src/test/java/io/ebean/json/EJsonTests.java b/ebean-core/src/test/java/io/ebean/json/EJsonTests.java index 2de0dd6b6..770aa8378 100644 --- a/ebean-core/src/test/java/io/ebean/json/EJsonTests.java +++ b/ebean-core/src/test/java/io/ebean/json/EJsonTests.java @@ -2,7 +2,7 @@ package io.ebean.json; import io.ebean.text.json.EJson; import io.ebeaninternal.json.ModifyAwareMap; -import io.ebeaninternal.json.ModifyAwareOwner; +import io.ebean.ModifyAwareType; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import org.junit.Test; @@ -293,7 +293,7 @@ public class EJsonTests { Set set = EJson.parseSet(jsonInput, true); - ModifyAwareOwner modAware = (ModifyAwareOwner) set; + ModifyAwareType modAware = (ModifyAwareType) set; assertFalse(modAware.isMarkedDirty()); Iterator iterator = set.iterator(); diff --git a/ebean-core/src/test/java/io/ebeaninternal/json/ModifyAwareMapTest.java b/ebean-core/src/test/java/io/ebeaninternal/json/ModifyAwareMapTest.java index 589e4bf11..a9bfbb929 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/json/ModifyAwareMapTest.java +++ b/ebean-core/src/test/java/io/ebeaninternal/json/ModifyAwareMapTest.java @@ -59,7 +59,7 @@ public class ModifyAwareMapTest { ModifyAwareMap map = createMap(); assertFalse(map.isMarkedDirty()); - map.markAsModified(); + map.setMarkedDirty(true); Assert.assertTrue(map.isMarkedDirty()); } diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/type/ModifyAwareFlagTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/type/ModifyAwareFlagTest.java index 9fbdc324c..3674a261c 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/type/ModifyAwareFlagTest.java +++ b/ebean-core/src/test/java/io/ebeaninternal/server/type/ModifyAwareFlagTest.java @@ -20,7 +20,7 @@ public class ModifyAwareFlagTest { ObjectOutputStream oos = new ObjectOutputStream(os); ModifyAwareFlag flag = new ModifyAwareFlag(); - flag.markAsModified(); + flag.setMarkedDirty(true); oos.writeObject(flag); oos.flush(); oos.close(); diff --git a/ebean-core/src/test/java/org/tests/json/TestDbJson_Jackson3.java b/ebean-core/src/test/java/org/tests/json/TestDbJson_Jackson3.java new file mode 100644 index 000000000..336946ab2 --- /dev/null +++ b/ebean-core/src/test/java/org/tests/json/TestDbJson_Jackson3.java @@ -0,0 +1,76 @@ +package org.tests.json; + +import io.ebean.BaseTestCase; +import io.ebean.DB; +import io.ebeantest.LoggedSql; +import org.junit.Test; +import org.tests.model.json.EBasicJsonJackson3; +import org.tests.model.json.EBasicJsonList; +import org.tests.model.json.PlainBean; +import org.tests.model.json.PlainBeanDirtyAware; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestDbJson_Jackson3 extends BaseTestCase { + + @Test + public void updateIncludesJsonColumn_when_explicit_isMarkedDirty() { + + PlainBeanDirtyAware contentBean = new PlainBeanDirtyAware("a", 42); + + EBasicJsonJackson3 bean = new EBasicJsonJackson3(); + bean.setName("b1"); + bean.setPlainValue(contentBean); + + bean.save(); + + final EBasicJsonJackson3 found = DB.find(EBasicJsonJackson3.class, bean.getId()); + found.setName("b1-mod"); + + LoggedSql.start(); + found.save(); + + List sql = LoggedSql.collect(); + assertThat(sql).hasSize(1); + assertThat(sql.get(0)).contains("update ebasic_json_jackson3 set name=?, version=? where id=? and version=?"); + + found.setName("b1-mod2"); + found.getPlainValue().setName("b"); + found.getPlainValue().setMarkedDirty(true); + + found.save(); + + sql = LoggedSql.stop(); + assertThat(sql).hasSize(1); + assertThat(sql.get(0)).contains("update ebasic_json_jackson3 set name=?, plain_value=?, version=? where id=? and version=?"); + + final EBasicJsonJackson3 found2 = DB.find(EBasicJsonJackson3.class, bean.getId()); + + assertThat(found2.getName()).isEqualTo("b1-mod2"); + assertThat(found2.getPlainValue().getName()).isEqualTo("b"); + } + + @Test + public void updateIncludesJsonColumn_when_loadedAndNotDirtyAware() { + + PlainBean contentBean = new PlainBean("a", 42); + EBasicJsonList bean = new EBasicJsonList(); + bean.setName("p1"); + bean.setPlainBean(contentBean); + + DB.save(bean); + final EBasicJsonList found = DB.find(EBasicJsonList.class, bean.getId()); + // json bean not modified but not aware + // ideally don't load the json content if we are not going to modify it + found.setName("p1-mod"); + + LoggedSql.start(); + DB.save(found); + + final List sql = LoggedSql.stop(); + assertThat(sql).hasSize(1); + assertThat(sql.get(0)).contains("update ebasic_json_list set name=?, bean_set=?, bean_list=?, plain_bean=?, version=? where id=?"); + } +} diff --git a/ebean-core/src/test/java/org/tests/model/json/EBasicJsonJackson3.java b/ebean-core/src/test/java/org/tests/model/json/EBasicJsonJackson3.java new file mode 100644 index 000000000..3d942d58b --- /dev/null +++ b/ebean-core/src/test/java/org/tests/model/json/EBasicJsonJackson3.java @@ -0,0 +1,55 @@ +package org.tests.model.json; + +import io.ebean.Model; +import io.ebean.annotation.DbJson; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Version; + +@Entity +public class EBasicJsonJackson3 extends Model { + + @Id + Long id; + + String name; + + @DbJson(length = 500) + PlainBeanDirtyAware plainValue; + + @Version + long version; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public PlainBeanDirtyAware getPlainValue() { + return plainValue; + } + + public void setPlainValue(PlainBeanDirtyAware plainValue) { + this.plainValue = plainValue; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } +} diff --git a/ebean-core/src/test/java/org/tests/model/json/PlainBeanDirtyAware.java b/ebean-core/src/test/java/org/tests/model/json/PlainBeanDirtyAware.java new file mode 100644 index 000000000..8573cbaa3 --- /dev/null +++ b/ebean-core/src/test/java/org/tests/model/json/PlainBeanDirtyAware.java @@ -0,0 +1,71 @@ +package org.tests.model.json; + +import io.ebean.ModifyAwareType; + +import java.sql.Timestamp; + +/** + * Something for Jackson ObjectMapper to marshall that is ModifyAwareType. + */ +public class PlainBeanDirtyAware implements ModifyAwareType { + + private transient boolean markedDirty; + + String name; + + long along; + + Timestamp timestamp; + + public PlainBeanDirtyAware(String name, long along) { + this.name = name; + this.along = along; + this.timestamp = new Timestamp(System.currentTimeMillis()); + } + + /** + * A constructor for Jackson. + */ + public PlainBeanDirtyAware() { + } + +// @JsonIgnore + @Override + public boolean isMarkedDirty() { + return markedDirty; + } + + @Override + public void setMarkedDirty(boolean markedDirty) { + this.markedDirty = markedDirty; + } + + @Override + public String toString() { + return "name:" + name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getAlong() { + return along; + } + + public void setAlong(long along) { + this.along = along; + } + + public Timestamp getTimestamp() { + return timestamp; + } + + public void setTimestamp(Timestamp timestamp) { + this.timestamp = timestamp; + } +}