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. 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); + } }