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 | 29 | 30 |
Tags
- 스프링 핵심 기능
- 스프링
- java
- Proxy
- Servlet
- kotlin
- QueryDSL
- springdatajpa
- 인프런
- JDBC
- 자바
- 그리디
- pointcut
- JPQL
- AOP
- Thymeleaf
- http
- Spring Boot
- 알고리즘
- Android
- SpringBoot
- Exception
- 스프링 핵심 원리
- transaction
- jpa
- 김영한
- 백준
- Greedy
- spring
- db
Archives
- Today
- Total
개발자되기 프로젝트
일대다[1:N] 본문
1. 일대다 단방향 매핑.
- "일"이 연관관계 주인.?
- 이 모델은 권장하진 않음..
- 표준에서 지원하긴 함.
- Team에서 Member를 참조하나 Member는 Team을 참조하지 않음..
- 하지만 DB입장에서 FK는 MEMBER("다")에 있음
- 즉, Team의 members를 변경했을 때, MEMBER 테이블의 TEAM_ID(FK)를 변경해야함.
-> 다른 테이블의 FK를 업데이트를 해야함..
2. TEST
@Entity
public class Team {
@Id
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> memberList = new ArrayList<>();
try{
Member member = new Member();
member.setUserName("hahahaha");
em.persist(member);
Team team = new Team();
team.setName("teamA");
team.getMemberList().add(member);
em.persist(team);
tx.commit();
}catch (Exception e){
tx.rollback();
}finally {
em.close();
}
emf.close();
}
- 업데이트 쿼리가 추가로 나갔다.
-
team.getMemberList().add(member);
- team의 memberList를 변경하면 MEMBER 테이블의 TEAM_ID(FK)를 변경해야 한다.
- 즉 TEAM 테이블이 아닌 MEMBER 테이블을 변경해야 하기 때문에. 업데이트 쿼리가 나가야한다.
-
Hibernate:
/* create one-to-many row hellojpa.Team.memberList */ update
Member
set
TEAM_ID=?
where
MEMBER_ID=?
3. 그럼 왜 잘 안쓸까?
- 객체를 수정한 것 과 쿼리가 날라가는게 달라지게 된다.
- Team을 수정했더니 TEAM 테이블이 아니라 MEMBER 테이블이 업데이트된다...? 뭐야??!???? 이래됨.
- 차라리 다대일 단방향 으로 설계하고, 필요시 양방향으로 추가.
4. 일대다 단방향 정리
- 일대다 단방향은 일대다에서 "일"이 연관관계 주인
- 테이블은 일대다 관꼐는 항상 "다"쪽에 외래 키가 있음
- 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한..구조 ㅜ
- @JoinColumn을 꼭! 사용해야 함. 그렇지 않으면 join table 방식을 사용함.
(중간 테이블을 하나 추가함.->성능 이슈 및 운영에 영향) - 일대다 단방향 매핑의 단점
- 엔티티가 관리하는 외래 키가 다른 테이블에 있음.. 맘에안들어..
- 연관관계 관리를 위해 추가 UPDATE SQL 실행
- 일대다 단방향 매핑 보다는.. 다대일 양방향 매핑을 사용하자.
5. 일대다 양방향....?ㄷㄷㄷ
- 야매로 되긴 됨.. 스펙은 아님..
- 요렇게 하면 됨.. 강제로 읽기 전용으로 만들면 됨 ㅋㅋㅋ
- Member -> Team
@ManyToOne @JoinColumn(name = "TEAM_ID", insertable = false, updatable = false) private Team team;
- 이렇게 하면 연관관계 주인같은데....
- insertable = false, updatable=false로 하면 insert, update안하니 읽기 전용처럼 됨.
- Member -> Team
6. 일대다 양방향 정리
- 공식적으로 없다. 야매다 ㅋㅋ
- @JoinColumn(insertable = false, updatable = false)
- 읽기 전용필드로 만들어서 양방향 처럼 사용
- 그냥 다대일 양방향을 사용하자 ㅋㅋㅋ
'인프런 > [인프런] 자바ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
다대다[N:M] (0) | 2021.08.11 |
---|---|
일대일[1:1] (0) | 2021.08.10 |
다대일 매핑[N:1] (0) | 2021.08.10 |
[예제] 연관관계 추가 (0) | 2021.08.10 |
양방향 연관관계와 연관관계 주인 - 주의점 (0) | 2021.08.10 |
Comments