Close
Close full mode
logo만렙 개발자 키우기

(2) 연관관계 사용

Git RepositoryEdit on Github
Last update: a year ago by nowwaterReading time: 2 min

연관관계를 등록, 수정, 삭제할 수 있다.

5.2.1 저장

public void testSave() {
//팀1 저장
Team team1 = new Team("team1", "팀1");
em.persist(team1);
//회원1 저장
Member member1 = new Member(100L, "회원1");
member1.setTeam(team1); //연관관계 설정 member1 -> team1
em.persist(member1);
//회원2 저장
Member member2 = new Member(101L, "회원2");
member2.setTeam(team1); //연관관계 설정 member2 -> team1
em.persist(member2);
}

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

MEMBER_IDNAMETEAM_IDTEAM_NAME
member1회원1team1팀 1
member2회원2team1팀1

5.2.2 조회

엔티티를 조회하는 방법은 2가지

  • 객체 그래프 탐색(객체 연관관게를 사용한 조회)
  • 객체지향 쿼리 사용(JPQL)

객체 그래프 탐색

Member member = em.find(Member.class, 100L);
Team team = member.getTeam(); // 객체 그래프 탐색 : 연관된 엔티티 조회
System.out.println("팀 이름 = " + team.getName());

객체 지향 쿼리

public static void testJPQL(EntityManager em) {
String jpql1 = "select m from Member m join m.team t where " +
"t.name = :teamName";
List<Member> resultList = em.createQuery(jpql1, Member.class)
.setParameter("teamName", "팀1")
.getResultList();
for (Member member : resultList) {
System.out.println("[query] member.username = " +
member.getUsername());
}
}
// 결과ㅣ [query] member.username=회원1
// 결과ㅣ [query] member.username=회원2
// 실행되는 쿼리
SELECT M.* FROM MEMBER MEMBER
INNER JOIN
TEAM TEAM ON MEMBER.TEAM_ID = TEAM1_.ID
WHERE
TEAM1_.NAME='팀1'

5.2.3 수정

연관관계를 수정하는 코드

private static void updateRelation(EntityManager em) {
// 새로운 팀2
Team team2 = new Team("team2", "팀2");
em.persist(team2);
//회원1에 새로운 팀2 설정
Member member = em.find(Member.class, 100L);
member.setTeam(team2);
}

수정은 em.update() 같은 메소드가 없다.

불러온 엔티티의 값만 변경하면 트랜잭션 커밋 시 플러시가 발생하여 변경감지 기능 작동

=> 변경사항을 데이터베이스에 자동으로 반영


5.2.4 제거

연관관계를 삭제하는 코드

private static void deleteRelation(EntityManager em) {
Member member1 = em.find(Member.class, "member1");
member1.setTeam(null); //연관관계 제거
}
// 실제 SQL
UPDATE MEMBER
SET
TEAM_ID = NULL, ...
WHERE
ID = 'member1'

5.2.5 연관된 엔티티 삭제

연관된 엔티티를 삭제하려면 기존에 있던 연관관계를 먼저 제거하고 삭제해야 한다.

그렇지 않으면 외래 키 제약조건으로 인해 데이터베이스에서 오류가 발생한다.

member1.setTeam(null); // 회원1 연관관계 제거
member2.setTeam(null); // 회원2 연관관계 제거
em.remove(team); // 팀 삭제
🚀 JPA — Previous
(1) 단방향 연관관계
Next — 🚀 JPA
(3) 양방향 연관관계