티스토리 뷰
반응형
양방향 연관관계와 연관관계의 주인2 - 주의점, 정리
tx.begin();
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
em.persist(member);
// em.flush();
// em.clear();
// team.getMembers().add(member);
Team findTeam = em.find(Team.class, team.getId());
List<Member> members = findTeam.getMembers();
위와 같이 실행했을 경우,
마지막 라인을 실행하면, findTeam.getMembers();의 size=0이 된다.
List<Member> members = findTeam.getMembers();
왜냐면 team객체는 이미 em.persist(team); 하면서 1차 캐시에 넣어주었으므로 그렇다.
그럼 members에 데이터가 보고싶다면 어떻게 해결해야할까?
1. em.flush(), em.clear()을 넣어주자.
em.flush(); // 이전 데이터들을 DB에 반영시켜주고,
em.clear(); // 1차캐시 내용을 clear 해준다.
- select query가 나가면서 Team객체 데이터를 불러온다.
2. team.getMembers().add(member);을 넣어준다.
- 위 코드를 넣어줌으로써, member객체에 추가해준다.
- select query 안나가고, 1차캐시에 member데이터가 추가된다.
그렇다면 team객체를 넣고싶을때는
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setUsername("member1");
member.setTeam(team); /////// 1
em.persist(member);
team.getMembers().add(member); ////// 2
Team findTeam = em.find(Team.class, team.getId());
List<Member> members = findTeam.getMembers();
항상 1, 2를 쓰면 까먹을 수 있으니까 아래처럼 set할 때 사용하는것이 좋다!
순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하자
- Member.java
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
- 이름도
이 아닌, changeTeam으로 바꾸면
setTeam- 중요한 느낌이 드니까 ㅎㅎ Tip!
또한, 양방향 매핑 시 무한루프를 조심하자!
- ex) toString(), Lombok 등
- toString 시
-
@Override public String toString() { return "Member{" + "id=" + id + ", username='" + username + '\'' + ", team=" + team + //// 해당 부분 실행 시, team.toString()이 실행되고 '}'; }
- Team객체 안에도 toString이 있다면 무한루프에 빠진다.
양방향 매핑 정리해보자
- 처음 설계 시 무조건 단방향 매핑으로 설계하자
- 양방향 매핑은 추후에 추가해도 늦이 않음
- 양방향 매핑은 반대 방향으로 조회기능이 추가된 것일뿐이다.
- JPQL에서는 역방향으로 탐색할 일이 많다.
연관관계의 주인은
- 외래키의 위치를 기준으로 정해야한다.
- ex) Member vs Team
반응형
'JPA' 카테고리의 다른 글
고급매핑 (0) | 2022.02.12 |
---|---|
다양한 연관관계 매핑 (0) | 2022.02.06 |
1 - JPA Study - 영속성 관리 - 내부 동작 방식 (0) | 2022.01.16 |
영속성 컨텍스트2 (0) | 2022.01.09 |
JPA 영속성과 생성주기 (0) | 2022.01.06 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 차이
- map
- 람다
- 영속성 컨텍스트
- BeanFactory
- java
- elasticsearch
- Vue
- lambda
- NPM
- webpack
- MAC
- springboot
- mvn
- install
- Intellij
- nginx
- 스트림
- container
- docker
- JPA
- ngnix
- 자바8
- 최종연산
- vscode
- AnnotationConfigApplicationContext
- ApplicationContext
- 중간연산
- stream
- Vuex
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함