※ 이 문서는 개인적인 필요에 의해 JPA 프로그래밍 책을 요약/추가 한 내용입니다.
단방향 연관관계
연관관계중에서는 다대일(N:1)을 가정 먼저 이해 하고 넘어가야 한다. 회원과 팀의 관계가 그에 해당 한다.
회원과 팀이 있다. 회원은 하나의 팀에만 속할 수 있다.
객체 연관관계
Member 객체는 Member.team 필드로 팀객체와 연관 관계를 맺고 있고 이는 단방향 관계이다. 즉 Member는 team 필드로 팀을 알수 있지만 Team은 Member를 알아 낼 수 없다.
테이블 연관관계
반면 테이블은 외래 키를 이용해서 양방향으로 조회 할 수 있다. 즉, 외래키를 이용해서 서로 JOIN해주면 양방향의 관계를 알아 낼 수 있다.
객체 관계 매핑
@ManyToOne
말그 대로 N:1의 관계를 라는 매핑 정보 이다.
속성
- optional
- 기본은 true인데 false로 설정하면 연관된 Entity가 꼭 있어야 한다.
- fetch
- 8장에서…
- FetchType.EAGER
- FetchType.LAZY
- cascade
- targetEntity
@JoinColumn(name=”TEAM_ID”)
JoinColumn 은 외래키를 매핑할 때 사용한다.
속성
- name
- referencedColumnName
- foreignKey(DDL)
- 외래키 제약조건을 직접 설정하기위한 속성이다.
- unique
- nullable
- insertable
- updatable
- columnDefinition
- table
연관관계 사용
저장
JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다.
조회
연관관계가 있는 엔티티를 조회 하는 방법은 “객체 그래프 탐색” 방법과 “객체지향 쿼리 사용” 이 있다.
객체 그래프 탐색
객체지향 쿼리 사용
객체지향 쿼리인 JPQL을 이용한 방법이다.
수정
em.update()와 같은 함수는 없다. 단순히 아래와 같이 처리하면 된다.
연관 관계 제거
아래와 같이 null로 처리해 주면 관계는 삭제 된다.
연관된 엔티티 삭제
연관된 엔티티를 삭제 하려면 해당 엔티티를 사용하는 모은 엔티티의 연관 관계를 제거 해줘야 한다.
양방향 연관관계
단방향에서는 “회원” –> “팀” 으로만 확인이 가능했다면 양방향에서는 “팀” –> “회원” 으로도 확인이 가능해야 한다. RDB의 Table에서의 관계는 양방향과 단방향이 모두 동일하다.(FK로 서로 교차 검색이 가능하다)
mappedBy는 양방향 매핑을 할때 반대쪽에 매핑할 필드의 이름이다.
연관관계의 주인
mappedBy는 왜? 필요할까??
- 객체에서 양방향 관계라는 것은 없다. -> 2개의 단방향 관계가 있는 것이다.
- mappedBy는 연관관계의 주인을 정해주는 작업이다.
- 연관관계의 주인은 외래키가 존재하는 엔티티가 된다.
- 즉, 연관관계 주인 만이 연관관계를 갱신할 수 있고, 반대편(inverse, non-owning side)는 읽기만 가능하다.
양방향 연관관계 저장 및 주의할 점
예제 에서는 Member.team 연관관계의 주인이므로 아래 코드의 내용에 주의 해줘야한다.
하지만 순수 객체로 따져 보면 위 예제의 정상과 비정상 예제의 내용이 모두 실행되어야 정상적으로 동작하게 된다. 그래서 Member의 setTeam을 아래와 같이 수정해 주면 순수 객체에서도 정상동작 하게 된다.