JPA 설계 주의점
주의점
- setter 사용 하지 말자
변경포인트가 너무 많아서 유지보수가 어렵다.
- 모든 연관관계는 지연로딩으로 설정
즉시로딩은 예측이 어렵고 JPQL 실행시 N + 1문제 연관된 엔티티를 함께 조회를 해야한다면
fetch join
또는 엔티티 그래프 기능 사용 OneToOne, ManyToOne관계는 기본이 즉시로딩이므로 지연로딩으로 설정 -
컬렉션은 필드에서 초기화하자
null에 안전 하이버네이트는 영속화 할때 컬렉션을 감싸서 하이버네이트가 제공하는 내장 컬렉션으로 변경 컬렉션을 변경 및 잘못 생성하게되면 내부 매커니즘 오류 발생. (컬렉션은 되도록 변경 하지 말자)
-
cascade
- 연관관계 편의 메소드
@Entity
@Table(name = "orders")
@Getter
@Setter
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "delivery_id")
private Delivery delivery;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
//===연관관계 메서드===//
public void setMember(Member member){
this.member = member;
member.getOrders().add(this); //member에 있는 orders의 리스트에 넣어주는것 까지 진행
}
public void addOrderItem(OrderItem orderItem){
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery){
this.delivery = delivery;
delivery.setOrder(this);
}
}