diff --git a/ebean-api/src/main/java/io/ebean/bean/EntityBeanIntercept.java b/ebean-api/src/main/java/io/ebean/bean/EntityBeanIntercept.java index 28ac8a8e7..2effe73d9 100644 --- a/ebean-api/src/main/java/io/ebean/bean/EntityBeanIntercept.java +++ b/ebean-api/src/main/java/io/ebean/bean/EntityBeanIntercept.java @@ -360,7 +360,7 @@ public final class EntityBeanIntercept implements Serializable { * Return true if the entity should be updated. */ public boolean isUpdate() { - return forceUpdate || state == STATE_LOADED; + return forceUpdate || state == STATE_LOADED || state == STATE_REFERENCE; } /** diff --git a/ebean-test/src/test/java/org/tests/model/onetoone/OtoChildVersion.java b/ebean-test/src/test/java/org/tests/model/onetoone/OtoChildVersion.java new file mode 100644 index 000000000..96539b0ea --- /dev/null +++ b/ebean-test/src/test/java/org/tests/model/onetoone/OtoChildVersion.java @@ -0,0 +1,66 @@ +package org.tests.model.onetoone; + +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Version; + +import io.ebean.annotation.Where; + +@Entity +public class OtoChildVersion { + + @Id + Integer id; + + String name; + + @OneToOne + OtoMasterVersion master; + + @Version + int version; + + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "ref_id") + @Where(clause = "${mta}.type=1") + List notifications; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public OtoMasterVersion getMaster() { + return master; + } + + public void setMaster(OtoMasterVersion master) { + this.master = master; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + +} diff --git a/ebean-test/src/test/java/org/tests/model/onetoone/OtoMasterVersion.java b/ebean-test/src/test/java/org/tests/model/onetoone/OtoMasterVersion.java new file mode 100644 index 000000000..2339d0f09 --- /dev/null +++ b/ebean-test/src/test/java/org/tests/model/onetoone/OtoMasterVersion.java @@ -0,0 +1,66 @@ +package org.tests.model.onetoone; + +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Version; + +import io.ebean.annotation.Where; + +@Entity +public class OtoMasterVersion { + + @Id + Long id; + + String name; + + @OneToOne(cascade = CascadeType.ALL, mappedBy = "master") + OtoChildVersion child; + + @Version + int version; + + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "ref_id") + @Where(clause = "${mta}.type=0") + List notifications; + + 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 OtoChildVersion getChild() { + return child; + } + + public void setChild(OtoChildVersion child) { + this.child = child; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + +} diff --git a/ebean-test/src/test/java/org/tests/model/onetoone/OtoNotification.java b/ebean-test/src/test/java/org/tests/model/onetoone/OtoNotification.java new file mode 100644 index 000000000..5f137af72 --- /dev/null +++ b/ebean-test/src/test/java/org/tests/model/onetoone/OtoNotification.java @@ -0,0 +1,51 @@ +package org.tests.model.onetoone; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class OtoNotification { + + @Id + Integer id; + + Integer refId; + + // 0 = master, 1 = child + Integer type; + + String text; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getRefId() { + return refId; + } + + public void setRefId(Integer refId) { + this.refId = refId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + +} diff --git a/ebean-test/src/test/java/org/tests/model/onetoone/TestOneToOneCascadeSave.java b/ebean-test/src/test/java/org/tests/model/onetoone/TestOneToOneCascadeSave.java index 5bc9e5bc7..e4875af11 100644 --- a/ebean-test/src/test/java/org/tests/model/onetoone/TestOneToOneCascadeSave.java +++ b/ebean-test/src/test/java/org/tests/model/onetoone/TestOneToOneCascadeSave.java @@ -2,8 +2,11 @@ package org.tests.model.onetoone; import io.ebean.BaseTestCase; import io.ebean.DB; +import io.ebean.Transaction; + import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; public class TestOneToOneCascadeSave extends BaseTestCase { @@ -29,5 +32,39 @@ public class TestOneToOneCascadeSave extends BaseTestCase { OtoMaster master2 = child2.getMaster(); assertNotNull(master2); } + + @Test + public void testSaveCascadeWithOneToOne() { + OtoMasterVersion master = new OtoMasterVersion(); + master.setName("m1"); + OtoChildVersion child = new OtoChildVersion(); + child.setName("c1"); + + master.setChild(child); + DB.save(master); + + assertThat(master.getVersion()).isEqualTo(1); + assertThat(child.getVersion()).isEqualTo(1); + + child.setName("c2"); + DB.save(master); + + assertThat(master.getVersion()).isEqualTo(1); + assertThat(child.getVersion()).isEqualTo(2); + + try (Transaction txn = DB.beginTransaction()) { + master = DB.find(OtoMasterVersion.class).findOne(); + + master.setName("m2"); + DB.save(master); + child = DB.find(OtoChildVersion.class).findOne(); + assertThat(child.getVersion()).isEqualTo(2); + child.setName("c3"); + DB.save(child); + + txn.commit(); + } + } + }