From d218fff374304bbf0e5410840ffbc392e98fca57 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Wed, 31 Aug 2016 23:03:00 +1200 Subject: [PATCH] #819 - Fix for bug in @ManyToOne relations with enabled soft-deletes --- .../ebeaninternal/api/LoadBeanRequest.java | 9 +++++++-- .../tests/softdelete/TestSoftDeleteBook.java | 19 ++++++------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/api/LoadBeanRequest.java b/src/main/java/com/avaje/ebeaninternal/api/LoadBeanRequest.java index 1ddafd046..2a66310de 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/LoadBeanRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/api/LoadBeanRequest.java @@ -169,8 +169,13 @@ public class LoadBeanRequest extends LoadRequest { EntityBeanIntercept ebi = batch.get(i); Object id = desc.getId(ebi.getOwner()); if (!loadedIds.contains(id)) { - logger.info("Lazy loading unsuccessful for type:" + desc.getName() + " id:" + id + " - expecting when bean has been deleted"); - ebi.setLazyLoadFailure(id); + if (desc.isSoftDelete()) { + // assume this is logically deleted (hence not found) + desc.setSoftDeleteValue(ebi.getOwner()); + } else { + logger.info("Lazy loading unsuccessful for type:" + desc.getName() + " id:" + id + " - expecting when bean has been deleted"); + ebi.setLazyLoadFailure(id); + } } } } diff --git a/src/test/java/com/avaje/tests/softdelete/TestSoftDeleteBook.java b/src/test/java/com/avaje/tests/softdelete/TestSoftDeleteBook.java index 5cdb6bb03..66755ec66 100644 --- a/src/test/java/com/avaje/tests/softdelete/TestSoftDeleteBook.java +++ b/src/test/java/com/avaje/tests/softdelete/TestSoftDeleteBook.java @@ -2,19 +2,11 @@ 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; @@ -68,20 +60,21 @@ public class TestSoftDeleteBook extends BaseTestCase { // check without softdeletes included book1 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book1").findUnique(); - book2 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book2").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"); + 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 - + + // lendBy is not null (as FK key value set, lendBy is non null reference bean) + ESoftDelUser lendBy = book1.getLendBy(); + assertThat(lendBy.isDeleted()).isTrue(); } }