Back-End/JPA

JPA - 1:N 단방향과 양방향에 대해서

Meluu_ 2024. 7. 9. 16:27

JPA 공부중 이해가 안가서 책을 참고하면서 이해한 것을 적어보려한다

 

먼저 JPA는 외래키를 관리하며 연관관계 주인만 사용한다.

주인이 아닌 Team.members는 조회를 위한 JPQL이나 객체 그래프를 탐색할 때 사용한다.

 

가정

Team : 1(연관관계 주인)
Member : N (FK) 

 

1:N 단방향 매핑을 하고 Team이 연관관계 주인이라 했을 때

Member는 Team을 모른다. 

 

아래의 코드를 실행해보자.

Member member = new Member();  
member.setUsername("member1");  
  
Team team = new Team();  
team.setName("team1");  
member.setTeam(team);  
team.getMembers().add(member);  
  
em.persist(member);  
em.persist(team);  
em.flush();  
em.clear();

결과

Hibernate: 
    /* insert for
        hellojpa.Member */insert 
    into
        Member (city, street, zipcode, USERNAME, MEMBER_ID) 
    values
        (?, ?, ?, ?, ?)
Hibernate: 
    /* insert for
        hellojpa.Team */insert 
    into
        Team (INSERT_MEMBER, createdDate, UPDATE_MEMBER, lastModifiedDate, name, TEAM_ID) 
    values
        (?, ?, ?, ?, ?, ?)
Hibernate: 
    update
        Member 
    set
        TEAM_ID=? 
    where
        MEMBER_ID=?

 

Member에 업데이트 쿼리가 나간다.

처음 Member를 만들고 Team을 만든 뒤 서로 연관관계를 설정하고 

em.persist를 하면

 

1. member를 저장 , member는 연관관계 주인이 아니기에 읽기만 가능하고 외래키 관리가 불가능, 따라서 TEAM_ID는 빈 상태

2. team을 저장

3. team에 추가했던 member를 보고 update 쿼리를 날려서 team id를 설정

 

이런 과정이 진행된다. 

 

 

 

양방향은 어떨까

양방향도 마찬가지이다.

전 글에서 말했듯이 1:N 양방향은 존재하지 않기에 단방향 2개로 member를 읽기전용으로 만든 후 진행한다.

따라서 연관관계 주인이 아닌 member는 읽기 전용이기에 setTeam으로 team 객체를 저장했지만 member 엔티티가 저장되고 나서 주인인 Team객체가 저장된 후  update 쿼리로 team id를 설정하게 된다. 

 

 

내 생각

결국엔 연관관계 주인이 연관관계 매핑을 해주기에 연관관계 주인이 주체가 된다.

주체를 통해서만 연관관계가 매핑된다.

 

 

 


🔖 학습내용 출처


김영한. (2021). 자바 ORM 표준 JPA 프로그래밍. 에이콘출판사

 

'Back-End > JPA' 카테고리의 다른 글

JPA - 프록시와 연관관계 관리  (0) 2024.07.10
JPA - 고급 매핑  (0) 2024.07.09
JPA - 다양한 연관관계 매핑  (0) 2024.07.09
JPA - 연관관계 매핑 기초  (0) 2024.07.05
JPA - 엔티티 매핑  (0) 2024.07.05