다대일 (복습, 제일 중요!)
- 단방향

- 양방향

일대다 (권장하지 않음)
- DB는 설계상 다 쪽에 외래키가 설정될 수 밖에 없다
- Member 객체에서 Team 객체를 탐색하는 것이 적어도 Member 쪽에 외래키 매핑하는 것을 권장
- (다대일 양방향 권장)
- @JoinColumn 사용하지 않으면 조인 테이블을 생성함
- 단방향

// Team class
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> members = new ArrayList<>();
Member member = new Member();
member.setUsername("member1");
em.persist(member); // -> insert SQL
Team team = new Team();
team.setName("TeamA");
team.getMembers().add(member);
em.persist(team); // -> insert SQL
// -> update SQL (MEMBER 테이블)
- 양방향 (스펙상 존재 X)

// Member class
@ManyToOne
@JoinColumn(name = "TEAM_ID', insertable = false, updatable = false) // 읽기 전용으로 강제
private Team team;
// Team class
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> members = new ArrayList<>();
일대일
주 테이블에 외래키
- 단방향: 다대일 단방향과 유사

// Locker class
@OneToOne(mappedBy = "locker")
private Member member;
- 양방향: 다대일 양방향과 유사

// Locker class
@OneToOne(mappedBy = "locker")
private Member member;
// Member class
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
대상 테이블에 외래키
- 단방향: JPA 미지원
- 양방향

- DBA 입장에서는 추후 비즈니스 로직의 변화까지 생각해서 어느 테이블에 외래키를 놓을지 결정할 것이다
- 주 : 대상 테이블 관계가 일대다가 될 것을 대비하여 대상 테이블에 외래키를 놓는 경우가 많다
- 개발자 입장에서는 MEMBER 테이블이 외래키를 갖는게 유리할 것이라는 의견
- 다수의 경우 Member 객체에서 Locker를 조회하기 때문
다대다 (사용하지 말 것)
- RDB는 테이블 2개로 다대다 관계 표현 불가 -> 조인 테이블로 연결해주어야 함 (테이블 3개)
- 객체는 컬렉션을 이용하여 객체 2개로 다대다 관계 표현 가능
- @ManyToMany, @JoinTable로 지원하지만 한계가 명확함: 조인 테이블에 id 매핑 정보 이외의 정보가 들어갈 수 없음
- PK, FK도 묶여있음

- 따라서 연결 테이블용 엔티티를 직접 만들어 추가 (조인 테이블 승격)


- 비즈니스와 관계없는 값(Generated Value)을 연결 테이블의 PK로 설정하는 것이 유연성이 생긴다
출처: 김영한님 JPA 프로그래밍 입문
'course > inflearn' 카테고리의 다른 글
[JPA 프로그래밍 기본편] 프록시와 연관관계 관리 (0) | 2022.09.09 |
---|---|
[JPA 프로그래밍 기본편] 고급 매핑 (0) | 2022.09.06 |
[JPA 프로그래밍 기본편] 연관관계 매핑 기초 (0) | 2022.09.01 |
[JPA 프로그래밍 기본편] 엔티티 매핑 (0) | 2022.08.31 |
[JPA 프로그래밍 기본편] 영속성 관리 (0) | 2022.08.30 |
다대일 (복습, 제일 중요!)
- 단방향

- 양방향

일대다 (권장하지 않음)
- DB는 설계상 다 쪽에 외래키가 설정될 수 밖에 없다
- Member 객체에서 Team 객체를 탐색하는 것이 적어도 Member 쪽에 외래키 매핑하는 것을 권장
- (다대일 양방향 권장)
- @JoinColumn 사용하지 않으면 조인 테이블을 생성함
- 단방향

// Team class
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> members = new ArrayList<>();
Member member = new Member();
member.setUsername("member1");
em.persist(member); // -> insert SQL
Team team = new Team();
team.setName("TeamA");
team.getMembers().add(member);
em.persist(team); // -> insert SQL
// -> update SQL (MEMBER 테이블)
- 양방향 (스펙상 존재 X)

// Member class
@ManyToOne
@JoinColumn(name = "TEAM_ID', insertable = false, updatable = false) // 읽기 전용으로 강제
private Team team;
// Team class
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> members = new ArrayList<>();
일대일
주 테이블에 외래키
- 단방향: 다대일 단방향과 유사

// Locker class
@OneToOne(mappedBy = "locker")
private Member member;
- 양방향: 다대일 양방향과 유사

// Locker class
@OneToOne(mappedBy = "locker")
private Member member;
// Member class
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
대상 테이블에 외래키
- 단방향: JPA 미지원
- 양방향

- DBA 입장에서는 추후 비즈니스 로직의 변화까지 생각해서 어느 테이블에 외래키를 놓을지 결정할 것이다
- 주 : 대상 테이블 관계가 일대다가 될 것을 대비하여 대상 테이블에 외래키를 놓는 경우가 많다
- 개발자 입장에서는 MEMBER 테이블이 외래키를 갖는게 유리할 것이라는 의견
- 다수의 경우 Member 객체에서 Locker를 조회하기 때문
다대다 (사용하지 말 것)
- RDB는 테이블 2개로 다대다 관계 표현 불가 -> 조인 테이블로 연결해주어야 함 (테이블 3개)
- 객체는 컬렉션을 이용하여 객체 2개로 다대다 관계 표현 가능
- @ManyToMany, @JoinTable로 지원하지만 한계가 명확함: 조인 테이블에 id 매핑 정보 이외의 정보가 들어갈 수 없음
- PK, FK도 묶여있음

- 따라서 연결 테이블용 엔티티를 직접 만들어 추가 (조인 테이블 승격)


- 비즈니스와 관계없는 값(Generated Value)을 연결 테이블의 PK로 설정하는 것이 유연성이 생긴다
출처: 김영한님 JPA 프로그래밍 입문
'course > inflearn' 카테고리의 다른 글
[JPA 프로그래밍 기본편] 프록시와 연관관계 관리 (0) | 2022.09.09 |
---|---|
[JPA 프로그래밍 기본편] 고급 매핑 (0) | 2022.09.06 |
[JPA 프로그래밍 기본편] 연관관계 매핑 기초 (0) | 2022.09.01 |
[JPA 프로그래밍 기본편] 엔티티 매핑 (0) | 2022.08.31 |
[JPA 프로그래밍 기본편] 영속성 관리 (0) | 2022.08.30 |