fix(#148): flush entity manager after @Modifying queries in PersonRepositoryTest
Native queries bypass the JPA first-level cache; flush+clear is required before reloading entities to see the updated state in the same transaction. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,8 @@ import org.springframework.boot.jdbc.test.autoconfigure.AutoConfigureTestDatabas
|
|||||||
import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest;
|
import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
|
import jakarta.persistence.EntityManager;
|
||||||
|
import jakarta.persistence.PersistenceContext;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -28,6 +30,9 @@ class PersonRepositoryTest {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private DocumentRepository documentRepository;
|
private DocumentRepository documentRepository;
|
||||||
|
|
||||||
|
@PersistenceContext
|
||||||
|
private EntityManager entityManager;
|
||||||
|
|
||||||
// ─── save and findById ────────────────────────────────────────────────────
|
// ─── save and findById ────────────────────────────────────────────────────
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -230,6 +235,8 @@ class PersonRepositoryTest {
|
|||||||
.sender(source).build());
|
.sender(source).build());
|
||||||
|
|
||||||
personRepository.reassignSender(source.getId(), target.getId());
|
personRepository.reassignSender(source.getId(), target.getId());
|
||||||
|
entityManager.flush();
|
||||||
|
entityManager.clear();
|
||||||
|
|
||||||
List<Document> docs = documentRepository.findBySenderId(target.getId());
|
List<Document> docs = documentRepository.findBySenderId(target.getId());
|
||||||
assertThat(docs).hasSize(1);
|
assertThat(docs).hasSize(1);
|
||||||
@@ -250,6 +257,8 @@ class PersonRepositoryTest {
|
|||||||
.sender(sender).receivers(Set.of(source)).build());
|
.sender(sender).receivers(Set.of(source)).build());
|
||||||
|
|
||||||
personRepository.insertMissingReceiverReference(source.getId(), target.getId());
|
personRepository.insertMissingReceiverReference(source.getId(), target.getId());
|
||||||
|
entityManager.flush();
|
||||||
|
entityManager.clear();
|
||||||
|
|
||||||
Document reloaded = documentRepository.findById(doc.getId()).orElseThrow();
|
Document reloaded = documentRepository.findById(doc.getId()).orElseThrow();
|
||||||
assertThat(reloaded.getReceivers())
|
assertThat(reloaded.getReceivers())
|
||||||
@@ -270,6 +279,8 @@ class PersonRepositoryTest {
|
|||||||
.sender(sender).receivers(Set.of(source, target)).build());
|
.sender(sender).receivers(Set.of(source, target)).build());
|
||||||
|
|
||||||
personRepository.insertMissingReceiverReference(source.getId(), target.getId());
|
personRepository.insertMissingReceiverReference(source.getId(), target.getId());
|
||||||
|
entityManager.flush();
|
||||||
|
entityManager.clear();
|
||||||
|
|
||||||
Document reloaded = documentRepository.findById(doc.getId()).orElseThrow();
|
Document reloaded = documentRepository.findById(doc.getId()).orElseThrow();
|
||||||
long targetCount = reloaded.getReceivers().stream()
|
long targetCount = reloaded.getReceivers().stream()
|
||||||
@@ -294,6 +305,8 @@ class PersonRepositoryTest {
|
|||||||
.sender(sender).receivers(Set.of(toDelete)).build());
|
.sender(sender).receivers(Set.of(toDelete)).build());
|
||||||
|
|
||||||
personRepository.deleteReceiverReferences(toDelete.getId());
|
personRepository.deleteReceiverReferences(toDelete.getId());
|
||||||
|
entityManager.flush();
|
||||||
|
entityManager.clear();
|
||||||
|
|
||||||
assertThat(documentRepository.findById(doc1.getId()).orElseThrow().getReceivers()).isEmpty();
|
assertThat(documentRepository.findById(doc1.getId()).orElseThrow().getReceivers()).isEmpty();
|
||||||
assertThat(documentRepository.findById(doc2.getId()).orElseThrow().getReceivers()).isEmpty();
|
assertThat(documentRepository.findById(doc2.getId()).orElseThrow().getReceivers()).isEmpty();
|
||||||
|
|||||||
Reference in New Issue
Block a user