해결된 질문
작성
·
306
0
<Member 클래스>
package jpabook.jpashop.domain;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter
@Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member") // 읽기 전용
private List<Order> orders = new ArrayList<>();
}
<Order 클래스>
package jpabook.jpashop.domain;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
import java.util.List;
import static jakarta.persistence.FetchType.*;
@Entity
@Table(name = "ORDERS")
@Getter @Setter
public class Order {
@Id
@GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "MEBMER_ID")
private Member member;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems;
@OneToOne(fetch = LAZY ,cascade = CascadeType.ALL)
@JoinColumn(name = "DELIVERY_ID", unique = true)
private Delivery delivery;
private LocalDateTime orderDate; // 주문시간
@Enumerated(EnumType.STRING)
private OrderStatus status;
//todo: 연관관계 메서드(양방향)
public void setMember(Member member) {
this.member = member; // Order -> member
member.getOrders().add(this); // member -> order
}
}
Order쪽에서 멤버와의 관계는 @ManyToOne이라 수정, 삭제가 가능해서 연관관계 메서드를 작성할 필요가 없지만, Member 쪽은 mappedBy로 매핑되어있기 때문에 Order를 참조할 때 읽기만 가능하다고 들었습니다. 따라서 Member쪽에서도 Order를 수정, 삭제를 하려면 값을 설정해야 하기 때문에 연관관계 메서드를 작성해야만 양방향 참조가 가능하다고 이해하였습니다.
정리하자면, 다 관계는 연관관계 메서드를 작성할 필요가 없고, 일 관계에서만 연관관계 메서드를 작성해야 양방향 참조가 가능한 것이 맞나요?
답변 1
2
안녕하세요. Ambition님
연관관계 편의 메서드는 어디에도 사용해도 괜찮습니다 🙂
mappedBy와 연관관계 편의 메서드의 위치는 무관합니다.
연관관계 편의 메서드가 어디에 있든 결국 연관관계의 주인쪽에 값이 설정되니까요.
감사합니다.
아 그렇군요 양방향일 때는 테이블 패러다임으로 볼 때 외래키를 참조해서 다른 엔티티에 값을 넣어주기 때문에 상관없다는거군요 덕분에 이해됬습니다! 감사합니다 :)