Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[예제] 다양한 연관관계 추가 본문

인프런/[인프런] 자바ORM 표준 JPA 프로그래밍

[예제] 다양한 연관관계 추가

Seung__ 2021. 8. 11. 19:51

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


 

GitHub - bsh6463/JPA_EXAMPLE

Contribute to bsh6463/JPA_EXAMPLE development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 자바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