Skip to content

Commit f07a355

Browse files
committed
Eliminate unnecessary merge() if entity is non-versioned
Fix spring-projectsGH-3401
1 parent 3ce4af2 commit f07a355

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,13 @@ public void delete(T entity) {
195195
return;
196196
}
197197

198-
entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity));
198+
if (entityInformation.getVersionAttribute().isPresent()) {
199+
// call merge() to raise ObjectOptimisticLockingFailureException if entity is stale
200+
entityManager.remove(entityManager.contains(entity) ? entity : entityManager.merge(entity));
201+
}
202+
else {
203+
entityManager.remove(existing);
204+
}
199205
}
200206

201207
@Override

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/JpaRepositoryTests.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
package org.springframework.data.jpa.repository.support;
1717

1818
import static org.assertj.core.api.Assertions.*;
19+
import static org.mockito.BDDMockito.then;
20+
import static org.mockito.Mockito.never;
21+
import static org.mockito.Mockito.reset;
1922

2023
import jakarta.persistence.EntityManager;
2124
import jakarta.persistence.OptimisticLockException;
@@ -29,6 +32,7 @@
2932
import org.junit.jupiter.api.BeforeEach;
3033
import org.junit.jupiter.api.Test;
3134
import org.junit.jupiter.api.extension.ExtendWith;
35+
import org.mockito.Mockito;
3236
import org.springframework.data.jpa.domain.sample.PersistableWithIdClass;
3337
import org.springframework.data.jpa.domain.sample.PersistableWithIdClassPK;
3438
import org.springframework.data.jpa.domain.sample.SampleEntity;
@@ -57,13 +61,16 @@ class JpaRepositoryTests {
5761

5862
@PersistenceContext EntityManager em;
5963

64+
private EntityManager spiedEntityManager;
65+
6066
private JpaRepository<SampleEntity, SampleEntityPK> repository;
6167
private CrudRepository<PersistableWithIdClass, PersistableWithIdClassPK> idClassRepository;
6268
private JpaRepository<VersionedUser, Long> versionedUserRepository;
6369

6470
@BeforeEach
6571
void setUp() {
66-
repository = new JpaRepositoryFactory(em).getRepository(SampleEntityRepository.class);
72+
spiedEntityManager = Mockito.spy(em);
73+
repository = new JpaRepositoryFactory(spiedEntityManager).getRepository(SampleEntityRepository.class);
6774
idClassRepository = new JpaRepositoryFactory(em).getRepository(SampleWithIdClassRepository.class);
6875
versionedUserRepository = new JpaRepositoryFactory(em).getRepository(VersionedUserRepository.class);
6976
}
@@ -187,6 +194,18 @@ void deleteStaleVersionedEntityShouldRaiseOptimisticLockException() {
187194
});
188195
}
189196

197+
@Test //GH-3401
198+
void deleteNonVersionedEntityShouldNotInvokeMerge() {
199+
SampleEntity entity = new SampleEntity("one", "eins");
200+
repository.save(entity);
201+
repository.flush();
202+
em.detach(entity);
203+
204+
reset(spiedEntityManager);
205+
repository.delete(entity);
206+
then(spiedEntityManager).should(never()).merge(entity);
207+
}
208+
190209
private interface SampleEntityRepository extends JpaRepository<SampleEntity, SampleEntityPK> {
191210

192211
}

0 commit comments

Comments
 (0)