Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Exception
- 백준
- 스프링 핵심 기능
- kotlin
- 알고리즘
- Proxy
- Thymeleaf
- Spring Boot
- QueryDSL
- springdatajpa
- 스프링
- db
- 스프링 핵심 원리
- transaction
- 인프런
- spring
- 자바
- Greedy
- JPQL
- 그리디
- JDBC
- http
- 김영한
- Android
- SpringBoot
- jpa
- Servlet
- AOP
- pointcut
- java
Archives
- Today
- Total
개발자되기 프로젝트
[예제] 다양한 연관관계 추가 본문
1. 엔티티
- 주문과 배송은 1:1
- 상품과 카테고리는 N:M
2. ERD
- ORDERS와 DELIVERY 관계에서 FK는 ORDRES에서 관리. ORDER가 주 TABLE
- 다대다는 일대다, 다대일 관계로 풀어야함. 중간 테이블 필요.
3. 엔티티 상세
4. 코드
- Delivery
@Entity
public class Delivery {
@Id @GeneratedValue
private Long id;
@OneToOne(mappedBy = "delivery")
private Order order;
private String city;
private String street;
private String zipcode;
private DeliveryStatus status;
}
- Category
- 다대다 매핑은 사용하지 말자.
- 단지 예시임.
@Entity
public class Category {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "PARENT_ID")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> childList;
@ManyToMany
@JoinTable(name = "CATEGORY_ITEM",
joinColumns = @JoinColumn(name = "CATEGORY_ID"),
inverseJoinColumns = @JoinColumn(name = "ITEM_ID"))
private List<Item> items = new ArrayList<>();
}
- Order
- Order와 Delivery는 일대일 관계이고, 연관관계 주인은 Order.
- 따라서 ORDERS 테이블에는 DELVERY_ID(FK)가 있어야 한다.
@Entity
@Table(name = "ORDERS") //DB에서 ORDER 예약어 ㅎㅎ
public class Order {
@Id
@GeneratedValue() //default = auto.
@Column(name = "ORDER_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
@OneToOne
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery;
public void addOrderItem(OrderItem orderItem) {
orderItem.setOrder(this);
orderItems.add(orderItem);
}
}
- TABLE 생성 로그
- ORDERS 테이블에 DELIVERY_ID가 들어간 것을 확인이 가능함.
create table ORDERS (
ORDER_ID bigint not null,
orderDate timestamp,
status varchar(255),
DELIVERY_ID bigint,
MEMBER_ID bigint,
primary key (ORDER_ID)
)
5. @JoinColumn
- 외래 키를 매핑할 때 사용.
속성 | 설명 | 기본값 |
name | 매핑할 외래 키 이름` | 필드명 + _ + 참조하는 테이블의 기본 키 컬럼 명 |
referencedColumnName | 외래 키가 참조하는 대상 테이블의 컬럼명 | 참조하는 테이블의 기본키 컬럼명 |
foreignKey(DDL) | 외래 키 제약조건을 직접 지정할 수 있다. 이 속성은 테이블을 생성할 때 만 사용함 |
|
unique nullable, insertable, updatable, columnDefinition, table |
@Column 속성과 같음. |
6. @ManyToOne
속성 | 설명 | 기본값 |
optional | false로 설정하면 연관된 엔티티가 항상 있어야 함. | TRUE |
fetch | fetch 전락, 연과관계 엔티티를 EAGER(즉시 로딩), LAZY(지연 로딩) |
|
cascade | 영속성 전이 | |
targetEntity | 연관된 엔티티의 타입 정보를 설정함. 이 기능은 거의 안씀~, 컬렉션을 사용해도 제너릭으로 타입 정보 알 수 있음. |
6. GitHub : 210811 EXAMPLE
'인프런 > [인프런] 자바ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
@MappedSuperclass (0) | 2021.08.11 |
---|---|
상속관계 (0) | 2021.08.11 |
다대다[N:M] (0) | 2021.08.11 |
일대일[1:1] (0) | 2021.08.10 |
일대다[1:N] (0) | 2021.08.10 |
Comments