티스토리 뷰
소스 코드는 여기 있습니다. (commit hash: 0bacabb)
> git clone https://github.com/lcalmsky/jpa > git checkout 0bacabb
Overview
연관관계 매핑 예제를 구현합니다.
테이블 구조
객체 구조
구현
테이블 구조에서 확인했다시피 FK
를 가지는 테이블은 orders
, order_item
두 가지이고, 객체 기준으로는 Order
, OrderItem
이 연관관계의 주인이 됩니다.
따라서
Order
가Member
를@ManyToOne
으로 가지고,@JoinColumn(name = "member_id")
을 사용해join
할 수 있습니다.OrderItem
이Order
를@ManyToOne
으로 가지고,@JoinColumn(name = "order_id")
을 사용해join
할 수 있습니다.
그리고 Member
, Order
는 각각 Order
, OrderItem
에 대해 반대 관계를 가집니다. 연관관계의 주인쪽으로 mappedBy
속성을 사용합니다.
Member
가Order
를@OneToMany
로 가지고,mappedBy = "member"
로 지정합니다.Order
가OrderItem
을@OneToMany
로 가지고,mappedBy = "order"
로 지정합니다.
소스 코드로 나타내면 다음과 같습니다.
/src/main/java/com/tistory/jaimenote/jpa/domain/entity/Member.java
package com.tistory.jaimenote.jpa.domain.entity;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.ToString.Exclude;
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@ToString
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
@OneToMany(mappedBy = "member")
@Exclude
private List<Order> orders = new ArrayList<>();
}
/src/main/java/com/tistory/jaimenote/jpa/domain/entity/Order.java
package com.tistory.jaimenote.jpa.domain.entity;
import com.tistory.jaimenote.jpa.domain.support.OrderStatus;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.ToString.Exclude;
@Entity
@Table(name = "orders")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@ToString
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order")
@Exclude
private List<OrderItem> orderItems = new ArrayList<>();
private LocalDateTime orderDateTime;
@Enumerated(EnumType.STRING)
private OrderStatus status;
}
/src/main/java/com/tistory/jaimenote/jpa/domain/entity/OrderItem.java
package com.tistory.jaimenote.jpa.domain.entity;
import com.tistory.jaimenote.jpa.domain.support.OrderStatus;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.ToString.Exclude;
@Entity
@Table(name = "orders")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@ToString
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order")
@Exclude
private List<OrderItem> orderItems = new ArrayList<>();
private LocalDateTime orderDateTime;
@Enumerated(EnumType.STRING)
private OrderStatus status;
}
/src/main/java/com/tistory/jaimenote/jpa/domain/entity/Item.java
package com.tistory.jaimenote.jpa.domain.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@ToString
public class Item {
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private Integer price;
private Integer stockQuantity;
}
'JPA' 카테고리의 다른 글
[JPA] 상속관계 매핑(1): 상속 전략 (1) | 2022.07.05 |
---|---|
[JPA] 다양한 연관관계 매핑 (0) | 2022.07.04 |
[JPA] 연관관계의 주인 (0) | 2022.06.30 |
[JPA] 양방향 연관관계 (0) | 2022.06.29 |
[JPA] 단방향 연관관계 (0) | 2022.06.28 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Java
- JPA
- 헥사고날 아키텍처
- 함께 자라기 후기
- spring boot application
- gRPC
- Jackson
- 클린 아키텍처
- Spring Boot JPA
- 함께 자라기
- 스프링 부트 애플리케이션
- 스프링 부트 튜토리얼
- spring boot jwt
- 알고리즘
- @ManyToOne
- Spring Boot Tutorial
- 스프링부트
- 스프링 부트 회원 가입
- 스프링 부트
- Spring Boot
- 스프링 데이터 jpa
- intellij
- QueryDSL
- Linux
- leetcode
- spring boot app
- JSON
- Spring Data JPA
- r
- proto3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함