public class Member {
@Id @GeneratedValue(startegy = GenerationType.IDENTIFY)
private Long id;
@ManyToOne
@JoinColum(name = "team_id")
private Team team;
}
다대일 양방향
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
private Long id;
@ManyToOne
@JoinColum(name = "team_id")
private Team team;
}
public class Team {
@Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
private Long id;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
일대다 1 : N
일대다 단방향
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
private Long id;
...
}
public class Team {
@Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "team_id")
private List<Member> members = new ArrayList<>();
}
일대다 단방향은 일대다에서 일이 연관관계의 주인
객체와 테이블의 차이 때문에 반대편 테이블이 외래 키를 관리하는 특이한 구조
@JoinColum을 꼭 사용해야 함. 그렇지 않으면 조인 테이블 방식을 사용해야 함
정리
일대다 단방향 매핑의 단점
엔티티가 관리하는 외래키가 다른 테이블에 있음
연관관계 관리를 위해 추가로 UPDATE SQL 실행
일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용
애초에 양방향을 가져가지 말자
일대일 1 : 1
일대일 단방향
public class Locker {
@Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
private Long id;
private String name;
}
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
private Long id;
private String username;
@OneToOne
@JoinColumn(name ="locker_id")
private Locker locker;
}
일대일 양방향
public class Locker {
@Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
private Long id;
private String name;
@OneToOne(mappedBy = "locker")
private Member member;
}
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
private Long id;
private String username;
@OneToOne
@JoinColumn(name ="locker_id")
private Locker locker;
}
정리
주 테이블의 외래 키 (일대일 단방향)
주 객체가 대상 객체의 참조를 가지는 것 처럼, 주 테이블에 외래키를 두고 대상 테이블을 찾음
객체지향 개발자가 선호
JPA의 매핑이 편리
장점으로 주 테이블만 조회하여도 대상 테이블의 데이터가 있는지 확인 가능
단점으로 값이 없으면 외래 키에 null 허용
대상 테이블의 외래 키 (일대일 양방향)
대상 테이블의 외래 키가 존재
전통적인 데이터베이스 개발자 선호
장점으로 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조 유지
단점으로 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩됨
상속관계 매핑
상속관계 매핑
관계형 데이터베이스는 상속 관계 x
슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
상속관계 매핑: 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑
@Inheritance(strategy = InheritanceType.XXX)
JOINED : 조인 전략
SINGLE_TALBE : 단일 테이블 전략
TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
@DiscriminatorColumn(name = “DTYPE”)
@DiscriminatorValue(”XXX”)
부모 클래스를 사용하지 않는다면 abstract class로 사용한다면 class로 만든다
연관관계 매핑시 고려사항 3가지
다중성
@ManyToOne
@OneToMany
@OneToOne
다대다 :@ManyToMany
단방향, 양방향
연관관계의 주인
다대일 N : 1
다대일 단방향
다대일 양방향
일대다 1 : N
일대다 단방향
@JoinColum
을 꼭 사용해야 함. 그렇지 않으면 조인 테이블 방식을 사용해야 함일대일 1 : 1
일대일 단방향
일대일 양방향
상속관계 매핑
상속관계 매핑
@Inheritance(strategy = InheritanceType.XXX)
@DiscriminatorColumn(name = “DTYPE”)
@DiscriminatorValue(”XXX”)
abstract class
로 사용한다면class
로 만든다상속관계 매핑 - 조인 전략
상속관계 매핑 - 단일 테이블 전략
Mapped Superclass - 매핑 정보 상속
em.find(BaseEntity.class)
불가