From 1cafea20c6b849f8ded0ae108c7823e83cfe9ece Mon Sep 17 00:00:00 2001 From: Christian Romming Date: Wed, 28 Aug 2013 23:06:37 +0200 Subject: [PATCH] Test and fix for BUG 420. --- .../server/persist/DefaultPersister.java | 4 ++- .../basic/TestDeleteCascadingOneToMany.java | 21 ++++++++++++ .../com/avaje/tests/model/basic/Section.java | 23 +++++++++++++ .../avaje/tests/model/basic/SubSection.java | 34 +++++++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/avaje/tests/basic/TestDeleteCascadingOneToMany.java create mode 100644 src/test/java/com/avaje/tests/model/basic/SubSection.java diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java index 36703a88e..1617d52b5 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java +++ b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java @@ -508,7 +508,9 @@ public final class DefaultPersister implements Persister { } else { // we need to fetch the Id's to delete (recurse or notify L2 cache/lucene) List childIds = manys[i].findIdsByParentId(id, idList, t, null); - delete(targetDesc, null, childIds, t); + if (!childIds.isEmpty()) { + delete(targetDesc, null, childIds, t); + } } } } diff --git a/src/test/java/com/avaje/tests/basic/TestDeleteCascadingOneToMany.java b/src/test/java/com/avaje/tests/basic/TestDeleteCascadingOneToMany.java new file mode 100644 index 000000000..f198f1116 --- /dev/null +++ b/src/test/java/com/avaje/tests/basic/TestDeleteCascadingOneToMany.java @@ -0,0 +1,21 @@ +package com.avaje.tests.basic; + +import junit.framework.TestCase; + +import com.avaje.ebean.Ebean; +import com.avaje.tests.model.basic.Article; +import com.avaje.tests.model.basic.Section; + +public class TestDeleteCascadingOneToMany extends TestCase { + + public void testDeleteCascadingOneToMany() { + Section s0 = new Section("some content"); + Article a0 = new Article("art1","auth1"); + a0.addSection(s0); + + Ebean.save(a0); + + Ebean.delete(a0); + } + +} diff --git a/src/test/java/com/avaje/tests/model/basic/Section.java b/src/test/java/com/avaje/tests/model/basic/Section.java index 2bdac133c..046df4b02 100644 --- a/src/test/java/com/avaje/tests/model/basic/Section.java +++ b/src/test/java/com/avaje/tests/model/basic/Section.java @@ -1,8 +1,13 @@ package com.avaje.tests.model.basic; +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.Lob; import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; import com.avaje.ebean.annotation.CacheStrategy; @@ -24,6 +29,9 @@ public class Section extends BasicDomain { @Lob String content; + + @OneToMany(cascade=CascadeType.ALL) + List subSections; public Section() { } @@ -55,5 +63,20 @@ public class Section extends BasicDomain { public void setArticle(Article article) { this.article = article; } + + public List getSubSections() { + return subSections; + } + + public void setSubSections(List subSections) { + this.subSections = subSections; + } + + public void addSubSection(SubSection s){ + if (subSections == null){ + subSections = new ArrayList(); + } + subSections.add(s); + } } diff --git a/src/test/java/com/avaje/tests/model/basic/SubSection.java b/src/test/java/com/avaje/tests/model/basic/SubSection.java new file mode 100644 index 000000000..ef89c30a5 --- /dev/null +++ b/src/test/java/com/avaje/tests/model/basic/SubSection.java @@ -0,0 +1,34 @@ +package com.avaje.tests.model.basic; + +import javax.persistence.Entity; +import javax.persistence.ManyToOne; + +import com.avaje.ebean.annotation.CacheStrategy; + +@CacheStrategy(useBeanCache=true) +@Entity +public class SubSection extends BasicDomain { + + private static final long serialVersionUID = 1L; + + @ManyToOne + private Section section; + + private String title; + + public SubSection() { + } + + public SubSection(String title) { + this.title = title; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + +}