본문 바로가기

공부 기록/Java

[JPA] 5장 - 연관관계 매핑 기초(2) - 연관관계 사용

연관관계 사용

저장

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

조회

- 연관관계가 있는 엔티티를 조회하는 방법은 크게 2가지다.

   - 객체 그래프 탐색(객체 연관관계를 사용한 조회)

Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); // 객체 그래프 탐색

   - 객체지향 쿼리 사용(JPQL)

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

- 실행된 SQL과 JPQL을 비교하면 JPQL은 객체(엔티티)를 대상으로 하고 SQL보다 간결하다.


수정

Team team2 = new Team("team2", "팀2");
em.persist(team2);

Member member = em.find(Member.class, "member1");
member.setTeam(team2); // 새로운 팀2 설정

- 단순히 불러온 엔티티의 값만 변경하면 트랜잭션을 커밋할 때 플러시가 일어나면서 변경 감지 기능이 작동한다. 그리고 변경사항을 데이터베이스에 자동으로 반영한다.


연관관계 제거

Member member1 = em.find(Member.class, "member1");
member1.setTeam(null); // 연관관계 제거

연관된 엔티티 삭제

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

member1.setTeam(null); // 회원1 연관관계 제거
member2.setTeam(null); // 회원2 연관관계 제거
em.remove(team); // 팀 삭제