From a2d3acfaf83ee117901b58287f3293486f51b9d3 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Fri, 8 Dec 2017 12:46:08 +0100 Subject: [PATCH 1/2] DATAJPA-931 - Prepare branch --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5e8e2ab228..05e6ac6082 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-jpa - 2.1.0.BUILD-SNAPSHOT + 2.1.0.DATAJPA-931-SNAPSHOT Spring Data JPA Spring Data module for JPA repositories. From 8265daffa00fe19e73d6f7039a288ad485b8751a Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Fri, 8 Dec 2017 14:15:02 +0100 Subject: [PATCH 2/2] DATAJPA-931 - Avoid unnecessary merging on save. Checking if entity is already attached to entity manager before calling merge. Fixed one test that was relying on the implicit flush triggered by the save. See also: https://vladmihalcea.com/2016/07/19/jpa-persist-and-merge/ --- .../support/SimpleJpaRepository.java | 5 +++- .../support/AuditingEntityListenerTests.java | 3 ++- .../support/SimpleJpaRepositoryUnitTests.java | 25 +++++++++++++++++++ 3 files changed, 31 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 df7c0d6fce..98a19911a1 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 @@ -66,6 +66,7 @@ * @author Mark Paluch * @author Christoph Strobl * @author Stefan Fussenegger + * @author Jens Schauder * @param the type of the entity to handle * @param the type of the entity's identifier */ @@ -487,9 +488,11 @@ public S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; - } else { + } else if (!em.contains(entity)) { return em.merge(entity); } + + return entity; } /* diff --git a/src/test/java/org/springframework/data/jpa/domain/support/AuditingEntityListenerTests.java b/src/test/java/org/springframework/data/jpa/domain/support/AuditingEntityListenerTests.java index ea07a4689b..3e9d8f2d0b 100644 --- a/src/test/java/org/springframework/data/jpa/domain/support/AuditingEntityListenerTests.java +++ b/src/test/java/org/springframework/data/jpa/domain/support/AuditingEntityListenerTests.java @@ -41,6 +41,7 @@ * Integration test for {@link AuditingEntityListener}. * * @author Oliver Gierke + * @author Jens Schauder */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:auditing/auditing-entity-listener.xml") @@ -89,7 +90,7 @@ public void auditsTransitiveEntitiesCorrectly() { role.setName("ADMIN"); user.addRole(role); - repository.save(user); + repository.flush(); role = user.getRoles().iterator().next(); assertDatesSet(user); 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 d15253752f..4043943a87 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 @@ -44,6 +44,7 @@ * @author Oliver Gierke * @author Thomas Darimont * @author Mark Paluch + * @author Jens Schauder */ @RunWith(MockitoJUnitRunner.Silent.class) public class SimpleJpaRepositoryUnitTests { @@ -131,4 +132,28 @@ public void shouldPropagateConfiguredEntityGraphToFindOne() throws Exception { verify(em).find(User.class, id, singletonMap(EntityGraphType.LOAD.getKey(), (Object) entityGraph)); } + + @Test // DATAJPA-931 + public void mergeGetsCalledWhenDetached() { + + User detachedUser = new User(); + + when(em.contains(detachedUser)).thenReturn(false); + + repo.save(detachedUser); + + verify(em).merge(detachedUser); + } + + @Test // DATAJPA-931 + public void mergeGetsNotCalledWhenAttached() { + + User attachedUser = new User(); + + when(em.contains(attachedUser)).thenReturn(true); + + repo.save(attachedUser); + + verify(em, never()).merge(attachedUser); + } }