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