From c1d99ae77ed5b69b6955f075b777538ae1e3812d Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Thu, 2 May 2019 10:23:47 +0200 Subject: [PATCH] DATAJPA-1535 - When deleting an entity we no longer merge it if it doesn't exist in the database. The merge happened to allow deleting of unmanaged entities. As a side effect it triggered an insert for new (and thereby also unmanaged) entities. By checking if the entity exists we avoid this now. The check should NOT trigger an additional select since the select would have happened in the past anyway. Original pull request: #378. --- .../support/SimpleJpaRepository.java | 13 +++++++++ ...lipseLinkNamespaceUserRepositoryTests.java | 7 +++++ .../jpa/repository/UserRepositoryTests.java | 15 ++++++++-- .../support/SimpleJpaRepositoryUnitTests.java | 29 +++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java b/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java index 708773fa7..e330f037c 100644 --- a/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java +++ b/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java @@ -168,6 +168,19 @@ public class SimpleJpaRepository implements JpaRepositoryImplementation repository.save(new User())).isInstanceOf(DataIntegrityViolationException.class); + } + + @Test // DATAJPA-1535 + public void deleteNewInstanceSucceedsByDoingNothing() { + repository.delete(new User()); + } + private Page executeSpecWithSort(Sort sort) { flushTestUsers(); diff --git a/src/test/java/org/springframework/data/jpa/repository/support/SimpleJpaRepositoryUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/support/SimpleJpaRepositoryUnitTests.java index a300bd62d..32167b669 100644 --- a/src/test/java/org/springframework/data/jpa/repository/support/SimpleJpaRepositoryUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/support/SimpleJpaRepositoryUnitTests.java @@ -156,4 +156,33 @@ public class SimpleJpaRepositoryUnitTests { verify(em).merge(attachedUser); } + + @Test // DATAJPA-1535 + public void doNothingWhenNewInstanceGetsDeleted() { + + User newUser = new User(); + newUser.setId(null); + + repo.delete(newUser); + + verify(em, never()).find(any(Class.class), any(Object.class)); + verify(em, never()).remove(newUser); + verify(em, never()).merge(newUser); + } + + @Test // DATAJPA-1535 + public void doNothingWhenNonExistantInstanceGetsDeleted() { + + User newUser = new User(); + newUser.setId(23); + + when(information.isNew(newUser)).thenReturn(false); + when(em.find(User.class,23)).thenReturn(null); + + repo.delete(newUser); + + verify(em, never()).remove(newUser); + verify(em, never()).merge(newUser); + } + }