연관관계 매핑

Ahri·2022년 6월 18일
0

HelloJPA

목록 보기
4/4

인프런 (자바 ORM 표준 JPA 프로그래밍 - 기본편, 김영한) 강의를 듣고 정리한 내용입니다

연관관계 매핑

1. 단방향과 양방향 : 매핑의 방향

1) 단방향 : Member 와 Order. Order 에서만 Member 를 조회하고 Member에서는 Order 조회 X.

Member : id, name ...
Order : id, member_id(FK), ...

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;
    ...}

@Entity
@Table(name = "ORDERS")
public class Order {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "memberId", insertable = false, updatable = false)
    private Member member; 
    ...}

2) 양방향 : Member와 Order 서로 조회함.

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;
    
    // 연관관계 추가
    @OneToMany(mappedBy = "member")
    private List<Order> Orders = new ArrayList<Member>();
    
    ...}

@Entity
@Table(name = "ORDERS")
public class Order {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "memberId", insertable = false, updatable = false)
    private Member member; 
    ...}
  • 연관관계의 주인이 외래키(FK) 등록/수정 관리. 주인이 아니면 조회만 가능
  • FK가 있는 쪽이 주인(Order)이 되고, 주인이 아닌쪽(Member)는 mapped by 를 통해 어디로 매핑되어 있는지 정의해야 함

*주의 1 : 순수 객체 상태를 고려해서 항상 양쪽에서 값을 설정하도록 해야 함

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "member")
    private List<Order> Orders = new ArrayList<Member>();
    
    public void setOrder(Order order){
        order.setMember(this); //연관관계 주인에게 값 설정
        this.orders.add(order); //주인이 아닌 객체도 값 설정
    }
    ...
}
    

*주의 2 : 양방향 매핑시에 무한 루프를 조심 (toString(), lombok 등)
Member 의 toString() -> Order 의 toString() -> Member 의 toString() ... 무한루프 발생

@Override
public String toString(){
    return "Member [ id= " +id+" , orders= "+orders ...; 
}

@Override
public String toString(){
    return "Order [ id= " +id+" , members= "+members ...; 
}

0개의 댓글