다오의 개발일지

TIL-23 스프링 연관관계 N:M 관계 2번째 방법 중간테이블 직접 생성 본문

WTIL

TIL-23 스프링 연관관계 N:M 관계 2번째 방법 중간테이블 직접 생성

다오__ 2023. 7. 13. 22:35

 

 

음식 entity

@Entity
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @OneToMany(mappedBy = "food")
    private List<Order> orderList = new ArrayList<>();
}

 

고객 entity

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "user")
    private List<Order> orderList = new ArrayList<>();
}

이전 글에서는 각각 @ManyToMany 어노테이션을 사용했지만 여기선 @OneToMany 어노테이션을 사용한다

 

 

주문 entity

 

@Entity
@Table(name = "orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "food_id")
    private Food food;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

중간 테이블 orders를 직접 생성하여 관리하면 변경 발생 시 컨트롤하기 쉽기 때문에 확장성에 좋다

여기서 외래키의 주인은 orders가 된다.

 

테스트를 해보자 편의상 모두 양방향으로 진행하였다.

@Test
@Rollback(value = false)
@DisplayName("중간 테이블 Order Entity 테스트")
void test1() {

    User user = new User();
    user.setName("Robbie");

    Food food = new Food();
    food.setName("후라이드 치킨");
    food.setPrice(15000);

    // 주문 저장
    Order order = new Order();
    order.setUser(user); // 외래 키(연관 관계) 설정
    order.setFood(food); // 외래 키(연관 관계) 설정

    userRepository.save(user);
    foodRepository.save(food);
    orderRepository.save(order);
}

@Test
@DisplayName("중간 테이블 Order Entity 조회")
void test2() {
    // 1번 주문 조회
    Order order = orderRepository.findById(1L).orElseThrow(NullPointerException::new);

    // order 객체를 사용하여 고객 정보 조회
    User user = order.getUser();
    System.out.println("user.getName() = " + user.getName());

    // order 객체를 사용하여 음식 정보 조회
    Food food = order.getFood();
    System.out.println("food.getName() = " + food.getName());
    System.out.println("food.getPrice() = " + food.getPrice());
}

등록하는 코드와 조회하는코드 둘 다 간단해진걸 확인할 수 있다.

 

 

마지막으로 주문일 추가 요구사항이 발생했을 때 어노테이션 활용

package com.sparta.jpaadvance.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Entity
@Getter
@Setter
@Table(name = "orders")
@EntityListeners(AuditingEntityListener.class)
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "food_id")
    private Food food;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    @CreatedDate
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime orderDate;
}

 

그리고 MainApp에서도 @EnableJpaAuditing 달아주자

 

'WTIL' 카테고리의 다른 글

TIL-25 Mockito  (0) 2023.07.17
TIL-24 테스트에 필요한 어노테이션  (0) 2023.07.17
TIL-22 스프링 연관관계 N:M 관계 1번째 방법  (0) 2023.07.13
TIL-21 스프링 특강 5회차 개념 0703  (0) 2023.07.03
WIL-6 7주차 WIL  (0) 2023.07.03