자바생
article thumbnail
728x90

연관관계 매핑 종류

그림은 단지 테이블을 보기위함 ( 화살표 상관 X )

  단방향 양방향
다대일 '다' : 연관관계 주인(Member)
@ManyToOne
@JoinColumn(name = "TEAM_ID")
'다' : 연관관계 주인 (Member)
@ManyToOne
@JoinColumn(name = "TEAM_ID")

'일' (Team)
@OneToMany
(mappedBy = "team")
일대다 '일' : 연관관계 주인 (Team)
@OneToMany
@JoinColumn(name = "TEAM_ID")
다대일 양방향 매핑 선호

 

 

  단방향 양방향
일대일 주 테이블, 대상 테이블에 따라
연관관계 주인 선택

'일' : 주 테이블(Member)
@OneToOne
@JoinColumn(name = "LOCKER_ID)
'일' : 주 테이블(Member)
@OneToOne
@JoinColumn(name = "LOCKER_ID)

'일' : 대상 테이블(Locker)
@OneToOne
@OneToOne(mappedBy = "locker")

 


일대다

일대다 의미는 연관관계 주인이 '일'에 있는 것이다.

 

단방향

//Team table에 insert 되는 내용
Team team = new Team();
team.setName("teamA");

//Team table에 insert 될 수 없는 내용
team.getMembers().add(member);

update 쿼리가 나가는 이유

 

왜 table에 insert 될 수 없을까?

table은 객체를 가지고 있지 않기 때문이다. 따라서 우리는 외래키를 바꿔줘야한다.

외래키는 지금 Team table이 아닌 Member table에 존재한다.

따라서 Member table에 있는 FK을 업데이트 해줘야한다.

 

양방향

Member Table

실무에서 잘 사용하지 않고 다대일 양방향 선호!

 


일대일

일대일은 단방향이든 양방향이든 일대일이다.

그래서 주 테이블, 대상 테이블로 나뉘어 연관관계 주인을 정해준다.

 

단방향

하지만 대상 테이블이 연관관계 주인이면서 단뱡향은 JPA가 지원하지 않는다.

 

양방향

현재 연관관계 주인은 주 테이블인 Member 이므로

Locker Entity에는 mappedBy 속성이 사용된 것을 알 수 있다.

 


다대다

다대다는 웬만하면 일대다, 다대일 구조로 바꾸는 것이 좋다.

 

단방향

중간에 MEMBER_PRODUCT 라는 테이블이 하나 만들어지게 된다.

해당 테이블에는 FK로 member id와 product id를 가지고 있다.

 

양방향

양방향을 쓰면 안되는 이유는

중간 테이블에 추가 정보를 넣을 수 없다. ex) 주문시간, 수량 데이터

 


Reference

 

 

 

자바 ORM 표준 JPA 프로그래밍 (김영한 지음)

 

728x90

'Spring 강의 > JPA - 기본편' 카테고리의 다른 글

프록시와 연관관계 관리 (1) 프록시  (0) 2021.12.10
고급 매핑  (0) 2021.12.07
연관관계 매핑 기초  (0) 2021.11.29
앤티티 매핑  (0) 2021.11.20
영속성 관리 - 내부 동작 방식  (0) 2021.11.19
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그