예제를 풀다가..
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Team teamA = new Team();
teamA.setName("TeamA");
em.persist(teamA); // 1차캐시에 저장
Member member_A = new Member();
member_A.setName("memberA");
member_A.setTeam(teamA);
em.persist(member_A); // 1차 캐시에 저장
Member findMember = em.find(Member.class, member_A.getId()); // 1차 캐시에서 얻어옴
Team findTeam= findMember.getTeam(); // 1차캐시에서 얻어온것
System.out.println(findTeam.getMembers().size()); // 0
tx.commit();
@Test
@Transactional
void contextLoads() {
Member member = Member.builder().name("김길동").build();
em.persist(member);//1차 캐시에 저장
Team team = Team.builder().name("이름이").build();
em.persist(team);//1차 캐시에 저장
team.settingMember(member);//양방향으로 setting해주는 건 아니고 member만 team에 넣어줬다
Member findMember = em.find(Member.class, member.getId());
em.flush();//디비랑 동일해지도록 1차캐시내용을 디비로 전송한다
em.clear();
Team findTeam = em.find(Team.class, team.getId());//그래도 1차캐시에는 아직 setting되지 않았을테니 내용이 남아있다
//인스턴스의 내용은 다르다. 왜냐하면 디비에 내용보내서 얻어온 거일테니 냐용이 다르겠지
Assertions.assertEquals(findMember.getName(), findTeam.getMemberList().get(0).getName());
Assertions.assertEquals(findTeam.getName(), findMember.getTeam().getName());
}
Assertions.assertEquals(findMember, findTeam.getMemberList().get(0));
양방향 참조를 해줬는데도 왜 인스턴스의 내용이 다를까?