2022 02 22
2022-02-22¶
@DataJpaTest 부모가 2개인 엔티티 삽질¶
- 엔티티 구조
@Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class VentureCapital { @OneToMany(mappedBy = "ventureCapital", cascade = CascadeType.REMOVE) private List<Partnership> partnerships = new ArrayList<>(); } @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Project { @OneToMany(mappedBy = "project", cascade = CascadeType.REMOVE) private List<Partnership> partnerships = new ArrayList<>(); } @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Partnership { @ManyToOne(fetch = FetchType.LAZY) private VentureCapital ventureCapital; @ManyToOne(fetch = FetchType.LAZY) private Project project; }
- 문제점
-
@DataJpaTest에서 Project 지우면 Partnership도 지워지겠지? 근데 안지워짐 - 영속성 컨텍스트에 Partnership이랑 부모-자식 관계를 맺는 VentureCapital이 남아있어서 그럼 - TestEntityManager를 주입받아 flush(), clear() 뚝딱 해주자@BeforeEach void setUp() { projectRepository.saveAll(Arrays.asList(EOS, axieInfinity)); ventureCapitalRepository.save(hashed); } @Test @DisplayName("해당 Project 삭제되면 VentureCapital에서 체결했던 파트너쉽이 삭제된다.") void deleteProjectPartnershipDeleted() { // given Partnership hashedEOS = new Partnership(hashed, EOS); Partnership hashedAxieInfinity = new Partnership(hashed, axieInfinity); partnershipRepository.saveAll(Arrays.asList(hashedEOS, hashedAxieInfinity)); tem.clear(); tem.flush(); // when projectRepository.deleteById(EOS.getId()); // then List<Partnership> partnerships = partnershipRepository.findAll(); assertThat(partnerships).hasSize(1); }