김찬진의 개발 블로그

23/12/25 [@OneToMany 와 @ManyToOne() 즉, 단방향 매핑과 양방향 매핑] 본문

1일1배움/JPA (김영한 님)

23/12/25 [@OneToMany 와 @ManyToOne() 즉, 단방향 매핑과 양방향 매핑]

kim chan jin 2023. 12. 25. 00:53

케이스 예제 코드 출처는 김영한 님의 JPA강의 1편입니다.

 

케이스1)

@Entity
public class Team {

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "TEAM_ID")
    private Long id;

    private String name;

    @OneToMany(mappedBy = "team") // (1)
    private List<Member> members = new ArrayList<>(); // (2)
}

(1) 주인이 누군지 명시한다.

(2) 비즈니스 로직 상 Team 객체에 딸린 모든 Member 객체들을 보고 싶다

@Entity
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String username;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID") // (3)
    private Team team;
}

(3) 외래키를 가진 주인이다. Member 객체(주인O)를 통해 Team 객체 필드를 생성하거나 수정하는 것이 기준이다

 

 

 

 

 

 

케이스2)

@Entity
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "MEMBER_ID")
    private Long id;
    private String name;
    private String city;
    private String street;
    private String zipcode;

    @OneToMany(mappedBy = "member") // (1)
    private List<Order> orders = new ArrayList<>(); // (2)
}

(1) 주인이 누군지 명시한다.

(2) 비즈니스 로직 상 Member 객체에 딸린 모든 Order 객체들을 보고 싶다 (비추천. 관심사의 분리 X. 단방향 매핑만으로도 가능)

@Entity
@Table(name = "ORDERS")
public class Order {

    @Id @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ORDER_ID")
    private Long id;

    @ManyToOne 
    @JoinColumn(name = "MEMBER_ID") // (3)
    private Member member;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING) 
    private OrderStatus status;

    @OneToMany(mappedBy = "order") // (4)
    private List<OrderItem> orderItems = new ArrayList<>(); // (5)
}

(3) 외래키를 가진 주인이다. Order 객체(주인O)를 통해 Member 객체를 생성하거나 수정하는 것이 기준이다.

 

(4) 주인이 누군지 명시한다.

(5) 비즈니스 로직 상 Order 객체에 딸린 모든 OrderItem 객체들을 보고 싶다

@Entity
public class OrderItem {

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ORDER_ITEM_ID")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "ORDER_ID") // (6)
    private Order order;

    @ManyToOne
    @JoinColumn(name = "ITEM_ID") // (7)
    private Item item;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;
}

(6) 외래키를 가진 주인이다. OrderItem 객체(주인)을 통해 Order 객체를 생성하거나 수정하는 것이 기준이다.

(7) 외래키를 가진 주인이다. OrderItem 객체(주인)을 통해 Item 객체를 생성하거나 수정하는 것이 기준이다.

 

 

Comments