Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2주차 - 엔티티 매핑 및 연관관계 매핑 기초 #17

Open
2 tasks done
toychip opened this issue Sep 16, 2023 · 7 comments
Open
2 tasks done

2주차 - 엔티티 매핑 및 연관관계 매핑 기초 #17

toychip opened this issue Sep 16, 2023 · 7 comments

Comments

@toychip
Copy link
Member

toychip commented Sep 16, 2023

📌 엔티티 매핑 및 연관관계 매핑 기초

객체와 테이블 매핑 및 엔티티 매핑을 학습한다.
단반향 연관관계와 양방향 연관관계 매핑을 학습하고 연관관계 주인을 학습한다.

  • CHAPTER 4. 엔티티 매핑
  • CHAPTER 5. 연관관계 매핑 기초
@jaepyo-Lee
Copy link
Contributor

1번
Identity전략은 pk값을 DB에 insert할때 알 수있게되는데, 이때 영속성컨텍스트는 해당 엔티티를 어떻게 관리하게 되는지?

@ankisile
Copy link
Member

ankisile commented Sep 23, 2023

2번
인강에서의 Team과 member의 연관관계에서
member1.setTeam(teamA); // 1
member1.setTeam(teamB); // 2
Member findMember = teamA.getMember(); => 어떤것이 조회되는가?

# Member 클래스의 메소드
public void setTeam(Team team) {
    this.team = team;
    team.getMembers().add(this);
}

@jyjyjy25
Copy link
Member

3번
기본키 매핑 시 IDENTITY 전략을 사용했을 때 쓰기 지연이 동작하는지? 이유도 같이 설명해 주세요.

@dionisos198
Copy link
Contributor

dionisos198 commented Sep 23, 2023

4번 0,1,2,3,4,5 사이에 어떤 쿼리가 나가는지 설명하라 단 Identity 전략을 사용하고

 public void addMember(Member member){
        this.members.add(member);
        member.setTeam(this);
    }

아래 코드의 team.addMember는 위로 정의 되어있다

   System.out.println("===========0============");
             Member member=new Member();
              member.setName("member1");
             em.persist(member);
            System.out.println("===========1===========");

            Team team=new Team();
            team.setName("teamA");
            team.addMember(member);
            em.persist(team);
            System.out.println("===========2==========");

             em.flush();
             em.clear();

            System.out.println("=============3========");
             Team findTeam=em.find(Team.class,team.getId());
            System.out.println("===========4============");
          tx.commit();
            System.out.println("===========5============");

@songhee1
Copy link
Member

songhee1 commented Sep 23, 2023

5번
List orders = member.getOrders();
orders.forEach(order1 -> {
order1.setStatus(OrderStatus.CANCEL);
});
order1의 orderStatus가 OrderStatus.CANCEL로 수정될지?

@toychip
Copy link
Member Author

toychip commented Sep 23, 2023

6번 이 3개의 컬럼들이 처음 실행했을 때와, 다시 실행했을 때, 추가가 되는지, 컬럼 변경이 되는지 설명
(단 hibernate.ddl= update)

@column(insertable = true, updatable = true)
private String name;

@column(insertable = true, updatable = false)
private String createdAt;

@column(insertable = false, updatable = true)
private String updatedAt;

@jaepyo-Lee
Copy link
Contributor

jaepyo-Lee commented Sep 25, 2023

퀴즈 정답

1번 정답

  • Identity전략사용시 em.persist() 를 통해 영속성 컨텍스트에 저장하는것이 아닌, DB에
    insert쿼리를 날려 저장시킨다. 그리고 바로 DB에서 pk값과 함께 불러와서 1차캐시에
    저장한다. 이때 select 쿼리는 날아가지 않는다. 왜냐하면 JDBC가 저장한 값을 return
    받는 알고리즘이 짜여있어서 select쿼리를 사용하지 않아도 괜찮다. 하지만 이런 방식
    때문에 Identity는 모아서 한번에 버퍼하여 보낼수 없다.

2번 정답

  • setTeam의 코드를 다음과 같이 변경
public void setTeam(Team team) {
  // 기존 팀과 관계를 제거
  if (this.team != null) {
  this.team.getMembers().remove(this);
  }
  this.team = team;
  team.getMembers().add(this);
}

flush,clear를 하면 상관없지만 커밋되기전에는 결국 자바코드이기때문에 문제가 된

3번 정답

  • JPA는 보통 em.persist() 호출 시점에 INSERT SQL을 생성하여 쓰기 지연 SQL 저장
    소에 저장하고, 트랜잭션 commit() 호출 시점에 INSERT SQL을 DB에 전달한다. 하지
    만 IDENTITY 전략을 사용할 경우 em.persist() 호출 시점에 INSERT SQL을 즉시 DB
    에 전달한다. 따라서 쓰기 지연이 동작하지 않는다.

4번 정답

  • 1번과 2번 사이team 에 대한 insert 문, 2번과 3번 사이:member에 대한 update문, 3번
    과 4번 사이 team select 문, 4번과 5번 사이에 없음

5번 정답

  • 수정된다.
    주인이 아닌 MEMBER에서는 읽기만 가능하다 = 연관관계를 수정하는 경우가 해당
    된다.
    member.getOrders.add(Order); 이런 경우에 아무런 변경이 일어나지 않는다.
    DB 상에는 둘의 관계가 자동으로 매핑되지 않는다고 이해하면 된다.

6번 정답

  • 처음 실행 됐을 때, name과 createAt은 컬럼이 생성이 되고, updatedAt은 생성이 되지
    않는다. 그 후 name은 값 변경이 가능하지만 createAt은 값 변경이 안된다. 만약 db에
    updateAt의 컬럼이 존재할경우 수정은 가능하다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants