엔티티 설계시 주의점
모든 연관관계는 지연로딩으로 설정!
- 즉시로딩 : 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생한다.
실무에서 모든 연관관계는 모두 lazy로 설정
@XToOne(OneToOne, ManyToOne)은 기본 fetch값이 EAGER이기 때문에 모두 LAZY로 바꿔줘야한다
(fethch = FETCHTYPE.LAZY)
package jpabook.jpashop.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "orders")
@Getter
@Setter
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order")
private List<OrderItems> orderItems = new ArrayList<OrderItems>();
@OneToOne
@JoinColumn(name = "delivery_id")
private Delivery deliverty;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
}
@Embeded @Embedable |
JPA의 내장타입을 사용할 때 |
@ManyToOne | 다대일 관계에서 다에 해당할 때 작성 |
@JoinColumn(name="member_id") | 외래키일 때 사용하는 것(주인) |
@OneToMany(mappedBy = "테이블 명") | 다대일 관계에서 일에 해당할 때 작성 |
@Inheritance | 상속관계 전략 지정 부모에 저장해야함 Strategy JOINED: 정규화된 SINGLE_TALBE : 싱글테이블 |
@DiscrimnatorColumn(name = "dtype") | DB 입장에서 저장할 때 구분해야하기 떄문에 사용하는 것 |
@DiscrimnatorValue("B") | DB 입장에서 저장할 때 구분해야하기 떄문에 사용하는 것 |
Cascate = CasacadeType.ALL | 각 객체 전부 하나하나 저장해야 하지만 사용시 큰 객체 하나만 저장해도 자동으로 casacade를 해준다. |
카테고리(자기 자신 Mapping)
객체는 컬랙션에 있어서 다대 다가 가능하지만 RDBMS는 join테이블을 통해 다대 다 관계를 풀어나갈 수 있다.
하지만 실무에서는 사용하지 않는다.
package jpabook.jpashop.domain.item;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter
@Setter
public class Category {
@Id
@Column(name = "category_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(name = "category_item",
joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name = "item_id"))
List<Item> items = new ArrayList<>();
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
}
'SpringBoot 코딩 > JPA와 SpringBoot코딩' 카테고리의 다른 글
2. 테이블 설계 (0) | 2022.05.16 |
---|---|
1. JPAShop 기본설정(JpaShop) (0) | 2022.05.16 |