diff --git a/src/test/java/com/avaje/tests/model/softdelete/ESoftDelBook.java b/src/test/java/com/avaje/tests/model/softdelete/ESoftDelBook.java new file mode 100644 index 000000000..a6556c3db --- /dev/null +++ b/src/test/java/com/avaje/tests/model/softdelete/ESoftDelBook.java @@ -0,0 +1,52 @@ +package com.avaje.tests.model.softdelete; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; + +import java.util.List; + +@Entity +public class ESoftDelBook extends BaseSoftDelete { + + String bookTitle; + + @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) + List lendBys; + + @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) + ESoftDelUser lendBy; + + + public ESoftDelBook(String bookTitle) { + this.bookTitle = bookTitle; + } + + public ESoftDelBook() { + } + + public String getBookTitle() { + return bookTitle; + } + + public void setBookTitle(String bookTitle) { + this.bookTitle = bookTitle; + } + + public List getLendBys() { + return lendBys; + } + + public void setLendBys(List lendBys) { + this.lendBys = lendBys; + } + + public void setLendBy(ESoftDelUser lendBy) { + this.lendBy = lendBy; + } + public ESoftDelUser getLendBy() { + return lendBy; + } +} diff --git a/src/test/java/com/avaje/tests/softdelete/TestSoftDeleteBook.java b/src/test/java/com/avaje/tests/softdelete/TestSoftDeleteBook.java new file mode 100644 index 000000000..5cdb6bb03 --- /dev/null +++ b/src/test/java/com/avaje/tests/softdelete/TestSoftDeleteBook.java @@ -0,0 +1,87 @@ +package com.avaje.tests.softdelete; + +import com.avaje.ebean.BaseTestCase; +import com.avaje.ebean.Ebean; +import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; +import com.avaje.ebeaninternal.server.deploy.BeanProperty; +import com.avaje.tests.model.softdelete.ESoftDelBook; +import com.avaje.tests.model.softdelete.ESoftDelRole; +import com.avaje.tests.model.softdelete.ESoftDelUser; + + +import org.avaje.ebeantest.LoggedSqlCollector; +import org.junit.Test; + +import java.awt.print.Book; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestSoftDeleteBook extends BaseTestCase { + + @Test + public void test() { + + // Create users + ESoftDelUser user1 = new ESoftDelUser("user1"); + Ebean.save(user1); + + ESoftDelUser user2 = new ESoftDelUser("user2"); + Ebean.save(user2); + + ESoftDelUser user3 = new ESoftDelUser("user3"); + Ebean.save(user3); + + // Create books + ESoftDelBook book1 = new ESoftDelBook("book1"); + book1.setLendBy(user1); + book1.setLendBys(Arrays.asList(user2, user3)); + Ebean.save(book1); + + ESoftDelBook book2 = new ESoftDelBook("book2"); + book2.setLendBy(user2); + book2.setLendBys(Arrays.asList(user1, user3)); + Ebean.save(book2); + + // check if everything is stored correctly in DB + book1 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book1").findUnique(); + book2 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book2").findUnique(); + + assertThat(book1.getLendBys().size()).isEqualTo(2); + assertThat(book2.getLendBys().size()).isEqualTo(2); + assertThat(book1.getLendBy().getUserName()).isEqualTo("user1"); + assertThat(book2.getLendBy().getUserName()).isEqualTo("user2"); + + // delete user 1 + Ebean.delete(user1); + + // check if everything is still stored correctly in DB (softdeletes included) + book1 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book1").setIncludeSoftDeletes().findUnique(); + book2 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book2").setIncludeSoftDeletes().findUnique(); + + assertThat(book1.getLendBys().size()).isEqualTo(2); + assertThat(book2.getLendBys().size()).isEqualTo(2); + assertThat(book1.getLendBy().getUserName()).isEqualTo("user1"); + assertThat(book2.getLendBy().getUserName()).isEqualTo("user2"); + + + // check without softdeletes included + book1 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book1").findUnique(); + book2 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book2").findUnique(); + + assertThat(book1.getLendBys().size()).isEqualTo(2); // user2 & user3 + assertThat(book2.getLendBys().size()).isEqualTo(1); // user1 (deleted) & user3 + assertThat(book2.getLendBy().getUserName()).isEqualTo("user2"); + + // expected behaviour: + // book1.getLendBy() == null + // current behaviour: + // book1.getLendBy() is a "dead" object. nearly every operation on the + // user object leads into an EntityNotFoundException + + assertThat(book1.getLendBy()).isNull(); // user1 is deleted + + } + +}