다음 글은 김영한 님의 자바 orm 기초의 책을 바탕으로 이해한 내용을 정리한 글입니다.
👊🏻 엔티티들은 대부분 다른 엔티티와 연관관계가 있다.
쇼핑몰을 예를 들면, 주문 엔티티는 다른 엔티티와 아예 상관이 없는게 아니라
주문 엔티티는 고객이 어떤 상품을 주문 했는지 알아야 하기 때문에
연관관계 : 주문 엔티티 - 상품엔티티 의 관계를 가진다.
또한 상품 엔티티는 상품의 재고를 알아야하기 때문에 재고 엔티티와 연관관계를 가진다.
그런데
객체 → 주소(참조)를 사용하여 관계
테이블 → 외래 키 (FK)를 이용해서 관계를 맺는다.
👊🏻 객체의 참조와 테이블의 외래키를 매핑하는 것이 목표
✏️ 연관관계 매핑 핵심 KEYWORDS
🍊 방향은 객체 관계에만 존재 / 테이블은 항상 양방향
객체를 양방향 연관관계로 만들 경우, 연관관계의 주인을 정해야 한다.
👊🏻 방향 - 단방향 연관관계
예시를 들어서 연관관계를 이해해보자
👊🏻 둘의 차이점
참조 통한 연관관계 → 단방향 관계 2개 ( 왜냐면 반대쪽에도 필드를 추가해서 참조 보관해야 하니깐 결국은 단방향 2개가 되어버린다.)
연관된 데이터 조회 시 : a.getB().getC() 사용
테이블을 통한 연관관계 → 외래 키 하나로 양방향 JOIN 가능
연관된 데이터 조회 시 : JOIN 사용 ( A JOIN B)
코드를 통해 이해해보자!
public static void main(String[]args){
Member member1=new Member("member1","회원1");
Member member2=new Member("member2","회원2");
Team team1= new Team("team1" , "팁1");
member1.setTeam(team1);
member2.setTeam(team1);
//회원 1, 2는 팀 1에 소속되어졌다.
Team findTeam=member1.getTeam();
// 회원1이 속한 팀1을 조회할 수 있다.
```
테이블 연관관계의 경우
ALTER TABLE MEMBER ADD CONSTRAINT FK_MEMBER_TEAM
FOREIGN KEY(TEAM_ID)
REFERENCESE TEAM
// 기본적으로 생성한 MEMBER / TEAM SQL문은 생략하였다.
// ALTHER문을 이용하여 MEMBER TABLE의 외래키(FOREIGN KEY) 제약 조건을 설정하였다.
// 외래키는 TEAM_ID 로, TEAM으로부터 참조하였다.
INSERT INTO TEAM(TEAM_ID,NAME) VALUESE("team1","팀1");
INSERT INTO TEAM(MEMBER_ID,TEAM_ID,USERNAME) VALUESE("members1","team1","회원1");
INSERT INTO TEAM(MEMBER_ID,TEAM_ID,USERNAME) VALUESE("members2","team2","회원2");
SELECT T.*
FORM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.ID
WHERE M.MEMBER_ID='member1'
//멤버의 아이디가 member1이 소속되어있는 팀의 id를 조회
🤖 join? : 두 개 이상의 테이블들을 연결하여 데이터 출력하는것
이제 객체 연관관계와 테이블 연관관계를 매핑해보자
public class Member{
@Id
@Column(name="MEMBER_ID")
private String id;
private String username;
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
public void setTeam(Team team){
this.team=team;
}
}
@ManyToOne : 다대일 매핑정보 / 연관관계 매핑 시 다중성 나타내는 어노테이션 사용
@ JoinColumn : 외래 키 매핑 사용한다 / name은 매핑할 외래 키 지정
매핑을 했으면 이제 매핑한 연관관계를 사용해보자
저장
member1.setTeam(team1); //회원에서 팀 참조
em.persist(member1); //참조한 팀의 회원 저장
jpa는 참조한 team.id를 외래 키로 사용해서 적절한 등록 쿼리 생성
조회
JPQL (객체지향 쿼리) 사용
객체 그래프 탐색
member.getTeam() 같이 객체를 통해 연관된 엔티티 조회
참조하는 대상만 변경하면 JPA가 처리
private static void updateRelation(EntityManager em){
Team team2 = new Team("team2","팀2");
em.persist(team2);
Member member=em.find(Member.class,"member1");
member.setTeam(team2);
}
연관관계 제거는 null로 설정하여 제거
삭제는 기존 연관관계를 null로 설정하여 먼저 제거한 후 삭제해야한다.