스파이더 웹 개발

다양한 연관관계 매핑 본문

JPA

다양한 연관관계 매핑

스파이더웹 2022. 9. 2. 15:44
728x90
반응형

분류

다 대 일 : @ManyToOne

일 대 다 : @OneToMany

일 대 일 : @OneToOne

다 대 다 : @ManyToMany

 

테이블은 외래키 하나로 두 테이블이 연관관계를 맺는다. 그러나 객체의 경우는 양방향에서 참조가 2군데 있는데, 둘 중 테이블의 외래키를 지정해주어야 한다. 각 분류에서 누가 연관관계의 주인이 되는지에 대해 알아보자. 왠만하면 테이블과 매핑 되는 객체를 연관관계의 주인으로해주자. 일대다 단방향 관계라고하면 다대일 양방향으로 개선해보자

 

다 대 일

다 대일 에서는 다 쪽인 Member가 연관관계의 주인이 되어, Membr 객체가 테이블의 외래키를 관리한다 

@Setter
@Getter
@Entity
public class Member {

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String name;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;

    public Member(){

    }
}

일 대 다

일대다 관계에서는 1인 Team 객체가 연관관계의 주인이며, Team객체라 테이블의 외래키를 관리한다

근데 이러한 경우 Team 객체가 Member 테이블의 외래키의 주인이기에, Update 쿼리가 한번더 실행이 된다

@Setter
@Getter
@Entity
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<>();
}

 

일 대 일 

주 테이블이나 대상 테이블 중에 외래키를 선택할 수 있다.

일대일 관계는 다대일 연관관계와 유사하다

@Setter
@Getter
@Entity
public class Locker {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToOne(mappedBy = "locker")
    private Member member;
}

@Setter
@Getter
@Entity
public class Member {
	
    //기존 동일
  
    @OneToOne
    @JoinColumn(name = "LOCKER_ID")
    private Locker locker;

 
}

 

다 대 다

관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 가없기에 연결테이블을 추가해서 일대다, 다대일 관계로 해결해야한다

728x90
반응형

'JPA' 카테고리의 다른 글

프록시와 연관관계 관리  (0) 2022.09.16
고급 매핑  (0) 2022.09.07
연관관계 매핑  (0) 2022.08.30
엔티티 매핑  (0) 2022.08.28
JPA 실행 중 발생 한 오류  (0) 2022.08.26
Comments