✅ 다중성
@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 곳이 있는데, 외래키를 관리할 곳을 설정해야함
외래키를 갖고있는 것이 연관관계의 주인이 됨
연관관계의 주인이 아닌것은 조회밖에 하지 못함
단방향을 쓰되 나중에 필요하면 양방향으로 바꾸기