티스토리 뷰


다대일 [N:1]

  • JPA에서 가장 많이 사용하고, 꼭 알야야 되는 다중성이다.

  • 아래 테이블에서 보면, DB 설계상 일대다에서 다 쪽에 외래키가 있어야 한다. 그렇지 않으면 잘못된 설계다.

  • 객체로 와서, 다대일 관계에서 다인 멤버에서 단순하게 팀으로 단방향 참조를 하고 싶다고 할 때, 테이블에 외래키 있는 쪽인 멤버 객체에서 팀객체로 연관관계 매핑 하면 된다.

  • 테이블에서 FK가 팀을 찾기 위해 존재하고, 객체에서 Team 필드도 Team을 참조하기 위해 존재한다.

  • 다대일의 반대는 일대다

다대일 단방향 매핑

  • JPA @ManyToOne 어노테이션을 사용해서 다대일 관계를 매핑한다.

  • @JoinColumn은 외래 키를 매핑할 때 사용한다. name은 매핑할 외래 키 이름이다.

public class Member {
...
 
   @ManyToOne
   @JoinColumn(name = "TEAM_ID")
   private Team team;
 
...
}

다대일 양방향 매핑

  • 다대일 관계에서 단방향 매핑을 진행하고, 양방향 매핑을 진행할 때

  • 반대쪽에서 일대다 단방향 매핑을 해주면 된다.(객체에서 컬렉션 추가해주면 된다.)

  • 여기서 중요한건, 반대에서 단방향 매핑을 한다고 해서 DB 테이블에 영향을 전혀 주지 않는다.

  • 다대일관계의 다 쪽에서 이미 연관관계의 주인이 되어서 외래키를 관리하고 있다.

  • 반대쪽에서 일대다 단방향 매핑. JPA의 @OneToMany 어노테이션을 사용한다.

    • 연관관계의 주인이 아니고, 어디에 매핑 됐는지에 관한 정보 (mappedBy = "team")을 꼭 넣어줘야 한다.

    • (mappedBy="team")이 의미하는 바는 Team의 members 필드가 Member 엔티티의 team 필드에 의해 매핑 되어졌다는 것이다.

      public class Team {
        ...

         @OneToMany(mappedBy = "team")
         private List<Member> members = new ArrayList<>();
         
        ...
      }
  • 실제 발생한 쿼리 확인.

    • Main.java

      Team team = new Team();
      team.setName("A");
      em.persist(team);
      System.out.println("-----팀 저장");

      Member member = new Member();
      member.setUsername("NJ");
      member.changeTeam(team);
      em.persist(member);
      System.out.println("-----멤버 저장");

      tx.commit();
    • 실제 발생한 쿼리

      Hibernate: 
         /* insert hello.jpa.Team
             */
             insert
             into
                Team
                (id, name)
             values
                (null, ?)
      -----팀 저장
      Hibernate:
         /* insert hello.jpa.Member
             */
             insert
             into
                Member
                (id, age, createdDate, description, lastModifiedDate, roleType, TEAM_ID, name)
             values
                (null, ?, ?, ?, ?, ?, ?, ?)
      -----멤버 저장
  • 정리

    • 외래키가 있는 쪽이 연관관계의 주인이고,

    • 양쪽을 서로 참조하도록 개발하면 된다.







'ICT Eng > JPA' 카테고리의 다른 글

[JPA] @OneToOne, 일대일[1:1] 관계  (0) 2019.08.23
[JPA] @OneToMany, 일대다[1:N] 관계  (1) 2019.08.23
[JPA] 연관관계 매핑시 고려사항  (0) 2019.08.23
[JPA] 양방향 연관관계  (0) 2019.08.16
[JPA] 단방향 연관관계  (0) 2019.08.16
댓글