일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Session1이 그 모든 클라이언트의 저올
- securityconfig
- ㅇㅇㅇㄴㅇ
- 스프링시큐리티
- HttpSecurity
- WebConfigurerAdapter
- 스프링 #스프링 시큐리티 #spring security
- Spring Security
- WebSecurity
- ㅂ
Archives
- Today
- Total
다오의 개발일지
TIL-23 스프링 연관관계 N:M 관계 2번째 방법 중간테이블 직접 생성 본문
음식 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 |