JPA에 대해 알아보자 : 6장 다양한 연관관계 매핑

ParkIsComing·2023년 2월 14일

Spring

목록 보기
4/21
post-thumbnail

책 [자바 ORM 표준 JPA 프로그래밍]을 참고하여 작성하였습니다.

6장 다양한 연관관계 매핑

다대일 단방향[N:1]

회원 엔티티

@Entity
@Data
public class Member{
    @Id
    @GeneratedValue
    @Column(name="MEBMER_ID")
    private Long id;
    
    private String username;
    
    private String city;
    private String street;
    private String zipcode;
    
    @ManyToOne
    @JoinColumn(name="TEAM_ID")
    private Team team;
    

}

팀 엔티티

@Entity
@Data
public class Team{
    @Id
    @GeneratedValue
    @Column(name="TEAM_ID")
    private Long id;
    
    private String name;
}

다대일 양방향[N:1, 1:N]

회원 엔티티

@Entity
@Data
public class Member{
    @Id
    @GeneratedValue
    @Column(name="MEBMER_ID")
    private Long id;
    
    private String username;
    
    private String city;
    private String street;
    private String zipcode;
    
    @ManyToOne
    @JoinColumn(name="TEAM_ID") //외래키 o -> 연관관계의 주인
    private Team team;
    

}

팀 엔티티

@Entity
@Data
public class Team{
    @Id
    @GeneratedValue
    @Column(name="TEAM_ID")
    private Long id;
    
    private String name;
    
    @OneToMany(mapped="team")
    private List<Member> members = new ArrayList<Member>();
}

일대다 단방향[1:N]

  • 예시: 하나의 팀은 회원들을 참조하지만, 회원은 팀은 참조하지 않음
  • 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자.
  • 일대다 단방향 매핑을 사용하면 엔티티를 매핑한 테이블이 아닌 다른 테이블의 외래키를 관리해야하 하므로 성능문제 & 관리부담
  • 다대일 양방향 매핑은 관리해야 하는 외래키가 본인 테이블에 있으므로 ok.

팀 엔티티

@Entity
@Data
public class Team{
    @Id
    @GeneratedValue
    @Column(name="TEAM_ID")
    private Long id;
    
    private String name;
    
    @OneToMany
    @JoinColumn(name="TEAM_ID")
    private List<Member> members = new ArrayList<Member>();
}

회원 엔티티

@Entity
@Data
public class Member{
    @Id
    @GeneratedValue
    @Column(name="MEBMER_ID")
    private Long id;
    
    private String username;
    
    private String city;
    private String street;
    private String zipcode;

}

일대다 양방향[1:N, N:1]

  • 없다!!! 다대일 양방향 매핑을 써라!!
  • 양방향 매핑에서 @OneToMany는 연관관계의 주인이 될 수 없다.
    -> @ManyToOne에는 mappedBy 속성이 없음.

일대일

  • 일대일 관계는 그 반대도 일대일 관계
  • 일대일 관계는 주 테이블이나 대상 테이블 중 어느쪽이나 외래키를 가질 수 있으므로 선택해야함.
  • 주 테이블에 외래키가 있는 게 더 편함.

다대다[N:N]

  • RDBMS는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
  • 중간에 연결테이블을 추가해야 한다.

0개의 댓글