[Spring]일대다 단방향 매핑

WOOK JONG KIM·2022년 11월 3일
0
post-thumbnail

일대다 양방향 매핑은 다루지 않음
-> @OneToMany를 사용하는 입장에서 어느 엔티티 클래스도 연관관계에 주인이 될 수 없기 때문

상품 분류 엔티티 클래스 생성

@Entity
@Getter
@Setter
@NoArgsConstructor
@ToString
@EqualsAndHashCode
@Table(name = "category")
public class Category {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(unique = true)
    private String code;
    
    private String name;
    
    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "category_id")
    private List<Product> products = new ArrayList<>();
    
}

상품 분류 테이블이 생성되고 상품 테이블에 외래키가 추가되었음

상품 분류 엔티티에서 @OneToMany@JoinColumn 사용하면 상품 엔티티에서 별도의 설정을 하지 않아도 단방향 연관관계가 매핑됨
-> 조인 칼럼은 필수는 아니지만 사용하지 않으면 중간 테이블로 Join 테이블이 생성됨

일대다 단방향 관계의 단점은 매핑 주체가 아닌 반대 테이블에 외래키가 추가됨
-> 다대일 구조와 다르게 외래키를 설정하기 위해 다른 테이블에 대한 update 쿼리를 발생

public interface CategoryRepository extends JpaRepository<Category, Long> {
}
@SpringBootTest
public class CategoryRepositoryTest {

    @Autowired
    ProductRepository productRepository;

    @Autowired
    CategoryRepository categoryRepository;

    @Test()
    void relationshipTest(){
        // 테스트 데이터 생성
        Product product = new Product();
        product.setName("펜");
        product.setPrice(2000);
        product.setStock(100);

        productRepository.save(product);

        Category category = new Category();
        category.setCode("S1");
        category.setName("도서");
        category.getProducts().add(product);

        categoryRepository.save(category);

        //테스트 코드
        List<Product> products = categoryRepository.findById(1L).get().getProducts();

        for(Product foundProduct : products){
            System.out.println(product);
        }


    }
}

이 테스트 코드 실행 시 update 쿼리 발생
-> 왠만하면 다대일 연관관계를 사용하는게 좋음

Hibernate: 
    select
        category0_.id as id1_0_0_,
        category0_.code as code2_0_0_,
        category0_.name as name3_0_0_,
        products1_.category_id as category8_1_1_,
        products1_.number as number1_1_1_,
        products1_.number as number1_1_2_,
        products1_.created_at as created_2_1_2_,
        products1_.updated_at as updated_3_1_2_,
        products1_.name as name4_1_2_,
        products1_.price as price5_1_2_,
        products1_.provider_id as provider7_1_2_,
        products1_.stock as stock6_1_2_,
        provider2_.id as id1_3_3_,
        provider2_.created_at as created_2_3_3_,
        provider2_.updated_at as updated_3_3_3_,
        provider2_.name as name4_3_3_,
        productdet3_.id as id1_2_4_,
        productdet3_.created_at as created_2_2_4_,
        productdet3_.updated_at as updated_3_2_4_,
        productdet3_.description as descript4_2_4_,
        productdet3_.product_number as product_5_2_4_ 
    from
        category category0_ 
    left outer join
        product products1_ 
            on category0_.id=products1_.category_id 
    left outer join
        provider provider2_ 
            on products1_.provider_id=provider2_.id 
    left outer join
        product_detail productdet3_ 
            on products1_.number=productdet3_.product_number 
    where
        category0_.id=?

일대다 연관관계에서는 category와 product의 조인이 발생해서 상품 데이터를 정상적으로 가져옴

profile
Journey for Backend Developer

0개의 댓글