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을 업데이트 해줘야한다.
양방향
실무에서 잘 사용하지 않고 다대일 양방향 선호!
일대일
일대일은 단방향이든 양방향이든 일대일이다.
그래서 주 테이블, 대상 테이블로 나뉘어 연관관계 주인을 정해준다.
단방향
하지만 대상 테이블이 연관관계 주인이면서 단뱡향은 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 |