4. 연관관계 매핑 기초

데일리·2022년 3월 17일
0

JPA 기초

목록 보기
4/10

1. 단방향 연관관계

//    @Column(name = "TEAM_ID")
//    private Long teamId;

@ManyToOne //한 팀에 여러개의 회원이 소속 멤버 입장이 many
@JoinColumn(name = "TEAM_ID")
private Team team;

2. 양방향 연관관계와 연관관계의 주인

@OneToMany(mappedBy = "team") //member의 team이랑 엮여 있다
private List<Member> members = new ArrayList<>();
  • mappedBy
    • 객체와 테이블이 관계를 맺는 차이
      • 객체 연관관계 2개 -> 각 객체 마다 참조 값이 존재
        - 회원 -> 팀 연관관계 1개(단방향)
        - 팀 -> 회원 연관관계 1개(단방향)
        - 객체의 양방향 관계는 양방향이 아니라 단방향 관계가 2개이다.
      • 테이블 연관관계 1개
        - 양방향 1개(조인을 하면 양쪽을 다 알 수 있다)
      • 외래키 관리에 딜레마가 생김
        - 팀을 바꾸려고 할 때 member의 teamId를 바꾸는 경우 혹은 Team member 리스트를 변경하는 경우
  • 연관관계의 주인
    • 객체의 두 관계 중 하나를 주인으로 선택
    • 연관관계의 주인만이 외래키를 등록 및 수정
    • 주인이 아닌 쪽은 읽기만 가능
    • 주인은 mappedBy 속성 사용 x
    • 주인이 아니면 mappedBy 속성 사용
    • 외래키가 있는 곳을 주인으로 지정
      - 1이 종속 n이 주인(1->team, n->member)
      • 다쪽이 무조건 연관관계의 주인

  • 양방향 매핑 때 가장 많이 하는 실수
    • 연관관계의 주인을 지정하지 않음
    • 연관관계의 주인에 값을 넣어야 된다.
Member member = new Member();
member.setUsername("member1");
em.persist(member);

Team team = new Team();
team.setName("TeamA");
team.getMembers().add(member); >> Member의 외래키 값이 null이 뜬다
em.persist(team);

==========================================================
Team team = new Team();
team.setName("TeamA");
em.persist(team);

Member member = new Member();
member.setUsername("member1");
member.setTeam(team); >>> 연관관계의 주인에 값을 주입해줘야한다
em.persist(member);

team.getMember().add(member);
  • team의 멤버 리스트는 읽기 전용
    • 양방향 매핑을 할 때 주인에만 값을 넣는 것이 아니라 둘다 값을 넣는 것이 좋다.
    • em.flush(), em.clear()가 없을 때
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);

 // 1차 캐시의 값을 그대로 가져온다. db select문이 아니라서 빈 배열이 나온다
Team findTeam = em.find(Team.class, team.getId());
List<Member> members = findTeam.getMembers();

>> commit 후 insert문이 실행되서 빈 컬랙션이 나온다
  • 무한 루프를 조심해야한다.

    • 양쪽으로 toString()을 했을 때
    • lombock toString은 사용 지양
    • 컨트롤러에는 엔티티를 절대 반환하지 마라
  • 양방향 매핑 정리

    • 단방향 매핑으로도 이미 연관관계 매핑은 완료
    • 양방향 매핑은 반대 방향으로 조회 기능이 추가 된 것
    • JPQL에서 역방향으로 탐생할 일이 많음
    • 단방향 매핑을 자랗면 양방향 매핑은 필요할 때 만 추가하면된다.
      - 테이블 수정 없이
profile
하루에 한편 씩 읽기 좋은 테크 로그

0개의 댓글

관련 채용 정보