다양한 연관관계 매핑

최주영·5일 전
0

JPA

목록 보기
5/5

✅ 연관관계 매핑시 고려사항 3가지

  • 다중성
  • 단방향, 양방향
  • 양방향일경우 연관관계의 주인

✅ 다중성

  • 다대일 : @ManyToOne
    다대일 관계에서는 인 부분에 외래키를 설정한다


다음 그림은 회원과 팀간의 단방향 관계를 맺는 그림이다
하나의 멤버는 하나의 팀에 속한다 + 하나의 팀은 다수의 멤버가 존재한다
그러므로 다대일 관계이다
밑에 코드는 다대일 단방향 의 예시이다

@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;
}
@Entity
public class Team{
	@Id @GeneratedValue
    @Column(name = "TEAM_ID")
    public Long id;
    private String name;
}

다음은 다대일 양방향 예시이다

단방향과 다르게 Team 에 새로 추가된 부분이 있다
하지만 추가한다고해서 테이블에 영향을 주지않는다

mappedBy 안에는 매핑된 자바 변수이름을 적어주면 된다

위 예시 코드에서 추가된 부분

@Entity
public class Team{
	@OneToMany(mappedBy = "team") // Member클래스의 team 변수에 의해서 매핑되었다라는것을 의미
    private List<Member> members = new ArrayList<>();
}
  • 일대다 : @OneToMany
    일대다 연관관계에서는 1이 연관관계의 주인임
    일대다 관계에서도 다(N) 쪽이 외래키가 있음
    엔티티에서 관리하는 외래키가 다른 테이블에 있음
    일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용 권장

  • 일대일 : @OneToOne
    주 테이블이나 대상 테이블 중에 외래 키 선택이 가능함
    외래키에 데이터베이스 유니크 제약조건을 추가하는 것을 권장


회원은 하나의 락커를 가지며, 하나의 락커의 주인은 한명이다 -> 일대일

@Entity
public class Locker{
	@Id @GeneratedValue
    private Long id;
    private String name;
}
@Entity
pubic class Member{
	@Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    
    @Column(name = "USERNAME")
    prviate String username;
    
    @OneToOne
    @JoinColumn(name = "LOCKER_ID")
    private Locker locker;
}

일대일 양방향 으로 만들려면 기존 Locker 클래스에서 밑에만 추가하면된다

@OneToOne(mappedBy = "locker")
private Member member;
  • 다대다 : @ManyToMany
    테이블의 N:M 관계는 중간테이블을 이용해서 1:N + N:1 로 나누어라

테이블 입장에서 외래 키 하나로 양쪽 조인이 가능함 = 방향이라는 개념이 없음

객체 입장에서는 참조용 필드가 있는 쪽으로만 참조가 가능
객체 양방향 관계는 참조가 2 곳이 있는데, 외래키를 관리할 곳을 설정해야함
외래키를 갖고있는 것이 연관관계의 주인이 됨
연관관계의 주인이 아닌것은 조회밖에 하지 못함

단방향을 쓰되 나중에 필요하면 양방향으로 바꾸기

  • 양방향 연관관계가 아니라도 어플리케이션 개발에 영향 X
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글