JPA

JPA시작(9)_연관관계 매핑(N:1, 단방향) / 연관관계 사용(등록, 수정, 삭제, 조회)

개발자 배찌 2021. 6. 8. 12:39
728x90

1. 연관관계 매핑 (다대일, 단방향매핑)

JPA를 사용하여 객체끼리의 연관관계, 테이블끼리의 연관관계가 아닌!!

객체와 테이블을 매핑해보자!!

 

매핑한 회원엔티티

@Entity
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;
     }

     //Getter, Setter ...
}

매핑한 팀 엔티티

@Entity
public class Team {
     @Id
     @Column (name = "TEAM_ID")
     private String id;
   
     private String name;

     //Getter, Setter...
}

@ManyToOne
     다대일( N:1 ) 관계라는 매핑정보.

     회원과 팀은 다대일 관계이다.

@JoinColumn (name = "TEAM_ID")

 조인컬럼은 외래키를 매핑할 때 사용

     name 속성에는 매핑할 외래키 이름을 지정..

     회원과 팀 테이블은 TEAM_ID 외래키로 연관관계를 맺음.

 

2. 연관관계 사용

1) 저장 

** JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속상태 여야 한다.

 

회원과 팀을 저장하는 코드

public void testSave() {
     Team team1 = new Team ("team1","팀1");
     em.persist(team1); //저장

     Member member1= new Member("member1","회원1");
     member1.setTeam(team1);  //연관관계설정 member1 -> team1
     em.persist(member1);

     Member member2= new Member("member2","회원2");
     member2.setTeam(team1);  //연관관계설정 member2 -> team1
     em.persist(member2);
}

JPA는 참조한 팀의 식별자(Team.id)를 외래키로 사용해서 적절한 등록쿼리를 생성한다.

 

이때 실행된 SQL

INSERT INTO TEAM (TEAM_ID, NAME) VALUES ('team1','팀1')
INSERT INTO TEAM (MEMBER_ID, NAME, TEAM_ID) VALUES ('member1','회원1','team1');
INSERT INTO TEAM (MEMBER_ID, NAME, TEAM_ID) VALUES ('member2','회원2','team1');

 

2) 조회

 

연관관계가 있는 엔티티를 조회하는 방법

  • 객체 그래프 탐색 
  • 객체지향 쿼리 사용 JPQL

 

▼객체 그래프 탐색

Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); //객체 그래프 탐색
System.out.println("팀이름 = " + team.getName());

 

▼객체 지향 쿼리 사용 JPQL

JPQL 조인검색

private static void queryLogicJoin(EntityManager em) {
     String jpql = "select m from Member m join m.team t where t.name=:teamName";

     List<Member> resultList = em.createQuery(jpql, Member.class)
                                         .setParameter("teamName","팀1")
                                         .getResultList();

     for (Member member : resultList) {
             System.out.prinltn("[query] member.username = " + member.getUsername());
     }
}

결과

[query] member.username=회원1
[query] member.username=회원2

 

3) 수정

 

팀1 소속이던 회원을 새로운팀2에 소속하도록 수정하기

 

연관관계를 수정하는 코드

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);
}

 

4.삭제

 

연관관계를 삭제하는 코드

private static void deleteRelation(EntityManager em) { 
     Member member1 = em.find(Member.class, "member1");
     member1.setTeam(null);   //연관관계 제거
}

 

연관된 엔티티를 삭제하려면 연관관계를 먼저 제거 하고 삭제해야한다!!

ex) 팀1에는 회원1과 회원2가 소속되어있다. 이때 팀1을 삭제하려면 연관관계를 먼저 끊어야한다.

member1.setTeam(null);
member2.setTeam(null);
em.remove(team);