일대다 양방향 매핑은 다루지 않음
-> @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의 조인이 발생해서 상품 데이터를 정상적으로 가져옴