티스토리 뷰

반응형

양방향 연관관계와 연관관계의 주인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);
    }
  • 이름도
    setTeam
    이 아닌, changeTeam으로 바꾸면
    • 중요한 느낌이 드니까 ㅎㅎ 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
링크
«   2024/10   »
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 31
글 보관함