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 |
Tags
- 스프링 부트 공식 문서
- 빈생성안됨
- 1차캐시
- git
- 스프링부트오류
- json
- Q 클래스
- Filter
- 최종 프로젝트
- 복합키
- @IdClass
- Unsatisfied dependency
- spring서버
- ERD 작성
- Error creating bean with name
- Spring Spring boot 차이
- jwt메서드
- 스프링 부트 기능
- JPA
- uncheck Exception
- github
- 인텔리제이
- json gson 차이
- JPA주의사항
- REST API 규칙
- queryDSL
- jpa에러
- JoinColumn
- REST란
- jpa회원가입
Archives
- Today
- Total
Everyday Dev System
Entity 연관관계 본문
<<요약>>
- DB 테이블에서는 테이블 사이의 연관관계를 FK(외래키)로 맺을 수 있고, 방향 상관없이 조회가 가능하다.
- Entity에서는 상대 Entity를 필드로 갖으면서 참조하여 Entity 사이의 연관 관계를 맺을 수 있습니다.
- 서로 상대방의 entity를 참조하고 있다면 양방향이고, 하나만 참조하고 있다면 단방향이다.
-> 상대 Entity를 참조하고 있지 않다면 상대 Entity를 조회할 수 있는 방법이 없다.
- Entity에서는 DB에는 없는 방향이라는 개념이 존재한다.
예시)
<<food와 음식이 N:1 양방향 & 단방향 관계일 경우>>
1. Food Entity에는 양방향, 단방향 둘다 user_id 필드가 필요하다.
------Food------@ManyToOne @JoinColumn(name="user_id") private User user;
2. User Entity에는 양방향일 때만 Food Entity 타입의 Litst를 필드로 갖는다.
그러나, 실제 user DB 테이블에는 해당 정보가 존재하지 않는다.
단방향일 때는 User에 해당 필드는 사라지며, User Entity에서 Food Entity를 조회할 수 없다.
-----User------
@OneToMany(mappedBy ="user") private List<Food> foodList = new ArrayList<>();
application.properties에 추가
server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/orderapp
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
mysql에서 orderapp Database 추가
해당 Database에 users, food table 추가
create table users
(
id bigint not null auto_increment,
name varchar(255),
primary key (id)
);
create table food
(
id bigint not null auto_increment,
name varchar(255),
price float(53) not null,
primary key (id)
);
ALTER TABLE users ADD food_id bigint;
INSERT INTO users (name, food_id) VALUES ('Robbie', 1);
INSERT INTO users (name, food_id) VALUES ('Robbert', 1);
INSERT INTO users (name, food_id) VALUES ('Robbie', 2);
ALTER TABLE food ADD user_id bigint;
INSERT INTO food (name, price, user_id) VALUES ('후라이드 치킨', 15000, 1);
INSERT INTO food (name, price, user_id) VALUES ('후라이드 치킨', 15000, 2);
INSERT INTO food (name, price, user_id) VALUES ('양념 치킨', 20000, 1);
create table orders
(
id bigint not null auto_increment,
user_id bigint,
food_id bigint,
order_date date,
primary key (id)
);
drop table if exists food;
drop table if exists users;
create table users
(
id bigint not null auto_increment,
name varchar(255),
primary key (id)
);
create table food
(
id bigint not null auto_increment,
name varchar(255),
price float(53) not null,
primary key (id)
);
alter table orders
add constraint orders_user_fk
foreign key (user_id)
references users (id);
alter table orders
add constraint orders_food_fk
foreign key (food_id)
references food (id);
INSERT INTO users (name) VALUES ('Robbie');
INSERT INTO users (name) VALUES ('Robbert');
INSERT INTO food (name, price) VALUES ('후라이드 치킨', 15000);
INSERT INTO food (name, price) VALUES ('양념 치킨', 20000);
INSERT INTO food (name, price) VALUES ('고구마 피자', 30000);
INSERT INTO food (name, price) VALUES ('아보카도 피자', 50000);
INSERT INTO orders (user_id, food_id, order_date) VALUES (1, 1, SYSDATE());
INSERT INTO orders (user_id, food_id, order_date) VALUES (2, 1, SYSDATE());
INSERT INTO orders (user_id, food_id, order_date) VALUES (2, 2, SYSDATE());
INSERT INTO orders (user_id, food_id, order_date) VALUES (1, 4, SYSDATE());
INSERT INTO orders (user_id, food_id, order_date) VALUES (2, 3, SYSDATE());
어떤 테이블을 기준으로 하든 결과는 같다.
SELECT u.name as username, f.name as foodname, o.order_date as orderdate
FROM users u
INNER JOIN orders o on u.id = o.user_id
INNER JOIN food f on o.food_id = f.id
WHERE o.user_id = 1;
SELECT u.name as username, f.name as foodname, o.order_date as orderdate
FROM food f
INNER JOIN orders o on f.id = o.food_id
INNER JOIN users u on o.user_id = u.id
WHERE o.user_id = 1;
1:N 양방향 관계를 java에서 collection을 사용해서 표현할 수 있다.
예를 들어 음식과 고객이 1:N 관계일 때, 한 명의 고객은 여러번 주문이 가능하다.
List<Food> foodList = new ArrayList<>();
'내배캠 주요 학습 > Spring 숙련' 카테고리의 다른 글
@ManyToOne 활용하기 (0) | 2023.06.21 |
---|---|
@OneToOne 외래키 활용 (1) | 2023.06.21 |
Client 서버에서 네이버 검색 API 활용 (0) | 2023.06.20 |
RestTemplate - Post 방식 : Client, Server 코드 설명 (0) | 2023.06.20 |
RestTemplate - get방식 : Server 코드 설명 (0) | 2023.06.20 |