Skip to content

Commit 3a17e80

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

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;
@@ -32,6 +35,7 @@
3235
import org.junit.jupiter.api.BeforeEach;
3336
import org.junit.jupiter.api.Test;
3437
import org.junit.jupiter.api.extension.ExtendWith;
38+
import org.mockito.Mockito;
3539
import org.springframework.beans.factory.annotation.Autowired;
3640
import org.springframework.data.jpa.domain.sample.PersistableWithIdClass;
3741
import org.springframework.data.jpa.domain.sample.PersistableWithIdClassPK;
@@ -65,14 +69,17 @@ class JpaRepositoryTests {
6569

6670
@PersistenceContext EntityManager em;
6771

72+
private EntityManager spiedEntityManager;
73+
6874
private JpaRepository<SampleEntity, SampleEntityPK> repository;
6975
private CrudRepository<PersistableWithIdClass, PersistableWithIdClassPK> idClassRepository;
7076
private JpaRepository<VersionedUser, Long> versionedUserRepository;
7177
private NamedParameterJdbcOperations jdbcOperations;
7278

7379
@BeforeEach
7480
void setUp() {
75-
repository = new JpaRepositoryFactory(em).getRepository(SampleEntityRepository.class);
81+
spiedEntityManager = Mockito.spy(em);
82+
repository = new JpaRepositoryFactory(spiedEntityManager).getRepository(SampleEntityRepository.class);
7683
idClassRepository = new JpaRepositoryFactory(em).getRepository(SampleWithIdClassRepository.class);
7784
versionedUserRepository = new JpaRepositoryFactory(em).getRepository(VersionedUserRepository.class);
7885
jdbcOperations = new NamedParameterJdbcTemplate(dataSource);
@@ -219,6 +226,18 @@ void deleteDirtyManagedVersionedEntityShouldRaiseOptimisticLockException() {
219226
jdbcOperations.update("delete from VersionedUser", Map.of());
220227
}
221228

229+
@Test //GH-3401
230+
void deleteNonVersionedEntityShouldNotInvokeMerge() {
231+
SampleEntity entity = new SampleEntity("one", "eins");
232+
repository.save(entity);
233+
repository.flush();
234+
em.detach(entity);
235+
236+
reset(spiedEntityManager);
237+
repository.delete(entity);
238+
then(spiedEntityManager).should(never()).merge(entity);
239+
}
240+
222241
private interface SampleEntityRepository extends JpaRepository<SampleEntity, SampleEntityPK> {
223242

224243
}

0 commit comments

Comments
 (0)