JPA

[JPA 7] 연관관계 - @OneToMany

snowkit 2022. 3. 10. 20:29

1:N 관계 (One-To-Many)

설명

  • 현재 Entity 객체(Team)가 One이고 연관된 객체(Member)가 Many라면 @OneToMany 선언
  • One 객체(Team)에서 연관된 모든 Many 객체(Member)를 조회하는 기능이 필요한 경우 사용한다

(권장하지 않음) One 객체에서 Many 객체의 외래키 관리

@Entity
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany
    @JoinColumn(name = "team_id")
    private List<Member> members;
}
  • DB에선 항상 Many 테이블이 외래 키를 갖는다
  • One 객체(Team)에서 @OneToMany와 함께 @JoinColumn(name = "컬럼명")을 설정하면 Many 테이블의 외래 키를 관리할 수 있다
    • 테이블과 객체의 차이(방향성) 때문에 JPA에서 지원하는 다른 테이블의 외래 키를 관리하는 기능
      • 단방향 One-To-Many 관계인 경우
      • 양방향 관계일 때 One 객체를 연관관계의 소유측으로 설정하는 경우
    • 다른 테이블에서 Many 테이블의 컬럼을 관리하는 모델은 유지보수 측면에서 헷갈릴 위험이 있으므로 좋은 방식이 아니다
      • @JoinColumn@ManyToOne이 선언된 Many 객체(Member)에서만 사용하는 것을 권장한다
    • @JoinColumn을 사용하지 않으면 기본값으로 @JoinTable 방식을 사용하게 되는데, 이 방식은 테이블을 하나 더 추가하기 때문에 운영도 복잡해지고 성능 측면에서도 더 좋지 않다

Many 객체에서 Many 객체의 외래키 관리

@Entity
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members;
}
  • @OneToMany(mappedBy = "Many 객체(Member)에 선언된 One 객체(Team)의 변수명")
  • 연관관계의 참조측을 One 객체(Team), 소유측을 Many 객체(Member)로 지정하여 양방향 연관관계를 맺을 수 있다
  • mappedBy를 사용하면 DB에 어떤 영향도 미치지 않기 때문에 언제든 사용할 수 있다

'JPA' 카테고리의 다른 글

[JPA 9] 연관관계 - 저장, 변경  (0) 2022.03.10
[JPA 8] 연관관계 - 방향성  (0) 2022.03.10
[JPA 6] 연관관계 - @ManyToOne  (0) 2022.03.10
[JPA 5] 영속성 컨텍스트  (0) 2022.02.22
[JPA 4] JPA 기본 사용법  (0) 2022.02.22