인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
💻 코드 (이전 게시물 코드에 이어서 추가)
package jpabook.jpashop.domain.item;
(생략)
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="dtype")
@Getter @Setter
public abstract class Item {
/*(생략)*/
@ManyToMany(mappedBy = "items")
private List<Category> categories = new ArrayList<>();
}
💻 코드
package jpabook.jpashop.domain;
import jpabook.jpashop.domain.item.Item;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter @Setter
public class Category {
@Id @GeneratedValue
@Column(name="category_id")
private Long id;
private String name;
@ManyToMany
/*설명*/
@JoinTable(name="category_item",
joinColumns = @JoinColumn(name="category_id"),
inverseJoinColumns = @JoinColumn(name="item_id") )
private List<Item> items = new ArrayList<>();
// 같은 엔티티 내에서 parent와 child 양방향 연관관계 설정
@ManyToOne
@JoinColumn(name="parent_id")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
}
👉 설명
@ManyToMany
객체는 컬렉션을 통해 다대다 관계 가능
관계형DB 에서 정규화된 테이블 2개로는 다대다 관계 불가능
💡 Join 테이블
을 통해 일대다, 다대일 관계로 풀어내야 가능
다대다 단방향 - @ManyToMany
, @JoinTable
@JoinTable
: 연관관계 주인 테이블에서 연결 테이블 지정
joinColumns
: 현재 컬럼과 매핑할 조인 컬럼 지정
inverseJoinColumns
: 반대쪽 컬럼과 매핑할 조인 컬럼 지정
다대다 양방향 - @ManyToMany
, mappedBy
mappedBy
: 연관관계 주인이 아니면 속성 값으로 연관관계 주인 지정
(주인은 mappedBy
속성 사용 ❌)
실무에서는 많은 정보를 다루기 때문에 중간 테이블에 다른 정보를 넣을 수 없어서 사용 ❌
실행 1 👉 에러 ❗
JpashopApplication 실행 했음에도 테이블 생성이 되지않음..
[jpabook.jpashop.domain.Delivery.status] was annotated as enumerated, but its java type is not an enum [jpabook.jpashop.domain.DeliveryStatus]
DeliveryStatus.java
public class DeliveryStatus {
//READY(배송 준비), COMP(배송)
}
DeliveryStatus를 enum으로 생성했어야 하는데 Java로 만들었다. 수정하자.
💡 해결
public enum DeliveryStatus {
//READY(배송 준비), COMP(배송)
}
코드 수정
실행 2 👉 성공
위와 같은 각 테이블을 생성해주는 sql문이 뜨면서
h2 데이터베이스에 테이블이 제대로 생성된 것을 확인!!