콘텐츠로 이동

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);
    }