❕ 문제 상황 : ChatMessage 검색 기능구현 중 test코드를 짜려고 데이터를 넣다가 발생했다
❗️ 에러 문구 : jakarta.persistence.EntityExistsException: detached entity passed to persist 오류
JPA에서 영속성 컨텍스트가 관리하지 않는(비영속 상태) 엔티티를 persist하려고 할 때 발생한다.
ChatMessage 엔티티의 id는 자동으로 생성되도록 했는데, 테스트 데이터를 넣을 때 임의로 생성해서 persist 해서 충돌이 발생했다
ChatMessage message1 = new ChatMessage(1, "room1", "user1", "안녕하세요!", LocalDateTime.now());
//chatMessage 엔티티의 id
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
<public ChatMessage(String roomId, String sender, String content, LocalDateTime createdAt) {
this.roomId = roomId;
this.sender = sender;
this.content = content;
this.createdAt = createdAt;
}
✅ 선택한 해결 방법
ID를 null로 설정하여 영속성 컨텍스트에 위임
- 엔티티의 ID를 null로 설정하고, @GeneratedValue에 의해 JPA가 자동으로 ID를 생성하도록 한다.
- 생성자 수정이나 SQL 스크립트 작성 없이 간단히 ID를 null로 설정하는 방식으로 문제를 해결할 수 있다.
💡 수정한 test 코드
@BeforeEach
public void before() {
queryFactory = new JPAQueryFactory(em);
ChatMessage message1 = new ChatMessage(null, "room1", "user1", "안녕하세요!", LocalDateTime.now());
ChatMessage message2 = new ChatMessage(null, "room1", "user1", "안녕!", LocalDateTime.now());
ChatMessage message3 = new ChatMessage(null, "room1", "user1", "hi!", LocalDateTime.now());
ChatMessage message4 = new ChatMessage(null, "room1", "user1", "안녕안녕!", LocalDateTime.now());
em.persist(message1);
em.persist(message2);
em.persist(message3);
em.persist(message4);
em.flush();
em.clear();
}