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 |