반응형
강의를 보던중 문득 이 생각이 들었다
public void changeTeam(Team team){
this.team = team;
team.getMembers().add(this);
}
Q : team.getMembers().add(this)를 해야할까?
만약 Member <-> Team 이 서로 연관관계 매핑이 되어있을 때
팀을 바꾸면 아래 코드에서 그냥 this.team = team 코드만 작성하면 되는거지
굳이 team.getMembers().add(this)를 왜하는 거지 라는 생각이 들었다.
Team 에서 List<Member> 를 조회하면 DB에 쿼리를 날려서 Team 에 연관된 Member의 정보를 가져올텐데
라는 생각으로 이해하는데 어려움이 생겼던거였다.
A : 문제는 JPA 영속성 컨텍스트에서 발생한다.
하지만 문제는 JPA 영속성 컨텍스트에서 발생한다.
만약 영속성 컨텍스트가 비활성화 되어있거나 , 영속성 컨텍스트가 활성화 되어있지만 트랜잭션이 커밋이 되지 않은 상태라면
Team을 조회해도 DB가 아닌 영속성 컨텍스트에 캐싱된 데이터에서 가져오기 때문에 추가된 Member의 정보가 반영되지 않는다.
결국 DB에 반영되기전에 조회를 하면 반영되기전 데이터를 가져오기때문에
양방향 연관관계 매핑이 되어 있다면 따로 List<Member>에서 add를 해줘야한다.
-> 한쪽에서 데이터를 추가했으면 다른 쪽 , 즉 양쪽 모두 추가해줘야한다.
이렇게 하면 메모리의 상태와 DB의 상태를 일치하게 유지할 수 있다.
반응형
'Spring' 카테고리의 다른 글
[Spring] 스프링 데이터 JPA 페이징 (0) | 2024.01.12 |
---|---|
[Spring] 스프링 JPA 메소드 설정 (0) | 2024.01.11 |
[Spring] Join >> JPQL vs SQL (1) | 2024.01.10 |
[Spring] @CASCADE , 고아 객체 (0) | 2024.01.08 |
[Spring] 지연 로딩 과 프록시 연관관계 (1) | 2024.01.07 |