개발서적/자바 ORM 표준 JPA

[자바 ORM 표준 JPA 프로그래밍] 5.2 연관관계 사용

Reference. 자바 ORM 표준 JPA 프로그래밍

책 목차 및 이전 글

5.2.1 저장

회원과 팀을 저장하는 JPA 코드
//팀1 저장
Team team1 = new Team("team1", "팀1");
em.persist(team1);

//회원1 저장
Member member1 = new Member("member1", "회원1");
member1.setTeam(team1); //연관관계 설정 member1 -> team1
em.persist(member1);
JPA에서 실행된 SQL
INSERT INTO TEAM(TEAM_ID, NAME) VALUES('team1', '팀1');

INSERT INTO MEMBER(MEMBER_ID, TEAM_ID, USERNAME)
VALUES('member1', 'team1', '회원1');

<주의>

  • JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 함
    • em.persist(team1)을 통해 영속화 후 member1.setTeam(team1)로 연관관계 설정

5.2.2 조회

  • 엔티티를 조회하는 대표적인 2가지 방법
    • 객체 그래프 탐색 (객체 연관관계를 사용한 조회)
    • 객체지향 쿼리 사용 (JPQL)
  • 객체 그래프 탐색
    • member.getTeam()을 사용해 member와 연관된 team엔티티를 조회
    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();
    • from Member m join m.team t 문법을 통해 Member와 Team을 조인
    • where 절에 t.name으로 검색조건 사용
      • :teamName과 같이 :로 시작하는 것은 파라미터 바인딩 문법을 의미
      --JPQL
      select m from Member m join m.team t
      where t.name=:teamName
      
      --SQL
      SELECT M.* FROM MEMBER MEMBER
      INNER JOIN 
      		TEAM TEAM1_ ON MEMBER.TEAM_ID = TEAM1_.ID
      WHERE 
      		TEAM1_.NAME='팀1'

5.2.3 수정

  • em.update() 같은 메소드는 존재X
  • 변경 감지 기능을 통해 트랜잭션 커밋시 자동 플러시로 update 기능 수행
    • 연관관계를 수정할 때도 동작, 참조하는 대상만 변경하면 JPA가 자동처리
JPA 수정 코드
//새로운 팀2
Team team2 = new Team("team2", "팀2");
em.persist(team2);

//회원1에 새로운 팀2 설정
Member member = em.find(Member.class, "member1");
member.setTeam(team2);
JPA에서 실행된 SQL
UPDATE MEMBER
SET 
		TEAM_ID='team2', ...
WHERE
		ID='member1'

5.2.4 연관관계 제거

JPA 연관관계 제거 코드
Member member1 = em.find(Member.class, "member1");
member1.setTeam(null);
JPA에서 실행된 SQL
UPDATE MEMBER
SET 
		TEAM_ID=null, ...
WHERE
		ID='member1'

5.2.5 연관된 엔티티 삭제

  • 연관된 엔티티를 삭제하려면 연관관계를 먼저 제거 후 삭제처리
    • 외래 키 제약 조건으로 인해 오류 발생
member1.setTeam(null); //회원1 연관관계 제거
member2.setTeam(null); //회원2 연관관계 제거
em.remove(team); //팀 삭제