• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

crud질문

23.01.27 23:13 작성 조회수 217

0

  1. 쓰기 지연 sql저장소에서 commit을 한번에 하는 데 select는 1차캐시에서 가지고 오는 건가요?

  2. 한 트랜잭션 안에 insert 와 select를 동시에 할 경우,



            Team team = new Team();
            team.setName("TeamA");
            em.persist(team);
//            System.out.println("team.getId() = " + team.getId());
//            System.out.println("team.getName() = " + team.getName());

//
//
            Member member = new Member();
            member.setUsername("member1");
            member.setTeam(team);
            System.out.println("==Before--");
            em.persist(member);
            System.out.println("==after--");

//            em.flush(); //현재 영속성 컨테스트에 있는것을 다 날려
//            em.clear();//영속성 컨테스트 초기화

//            //객체지향적이지 않은 방법
//            Member findMemner = em.find(Member.class, member.getId());
//            Long findteamId = findMemner.getTeamId();
//            Team findTeam = em.find(Team.class, findteamId);

//
            Member findMemner = em.find(Member.class, member.getId()); 
            Team findteam = findMemner.getTeam();
            System.out.println("findteam.getName() = " + findteam.getName());

findteam.getName()의 값이 나오는 이유가
1차 캐시에 저장된 @id에서 id값을 가지고 오기 때문에 commit되기 전(insert) 되기 전에
조회(select)문이 실행가능해지는 건가요?

답변 1

답변을 작성해보세요.

0

안녕하세요. jacomyou님

em.persist 직후에 em.find로 조회하게 되면 이미 1차 캐시에 엔티티가 있기 때문에 1차 캐시에서 엔티티를 조회하게 됩니다. 이때는 DB에서 조회하지 않습니다.

감사합니다.