자바 ORM 표준 JPA 프로그래밍 - 김영한
책 내용을 정리한 내용입니다.
6.1 다대일
6.2 일대다
6.3 일대일들어가기 전
엔티티 연관관계 매핑시 고려해야할 것
연관관계가 있는 엔티티가 일대일 관계인지 일대다 관계인지 다중성을 고려하고,
엔티티 중 한쪽만 참조하는 단방향 관계인지 서로 참조하는 양방향 관계인지 고려하고,
양방향 관계라면 주인을 정해야한다.
테이블은 외래키를 사용함으로 항상 양방향이다.
객체는 참조용 필드를 통해 연관된 객체를 조회한다. 한 쪽 객체만 참조하는 것을 단방향, 양 쪽 객체가 서로 참조하는 것을 양방향 관계라 한다.
테이블에서 연관관계를 관리하는 포인트는 외래키 하나지만 엔티티는 양방향 연관관계에서 A.b / B.a 두 곳의 포인트에서 연관관계를 관리한다.
따라서 JPA 는 두 객체 연관관계 중 하나를 정해서 데이터베이스 외래키를 관리해야하며 이를 연관관계의 주인이라 한다.
외래키를 가진 테이블과 매핑한 엔티티가 외래키를 관리하는게 효율적임으로 해당 엔티티를 연관관계의 주인으로 선택하는 것을 권장한다.
@Entity
public class Member {
@Id
private Long id;
private String memberName;
@ManyToOne
private Team team;
}
@Entity
public class Team {
@Id
private Long id;
private String name;
}
@Entity
public class Member {
@Id
private Long id;
private String memberName;
@ManyToOne
private Team team;
}
@Entity
public class Team {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members;
}
@Entity
public class Member {
@Id
private Long id;
private String memberName;
}
@Entity
public class Team {
@Id
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "team_id")
private List<Member> members;
}
@Entity
public class Member {
@Id
private Long id;
private String memberName;
@ManyToOne
@JoinColumn(name = "team_id", insertable = false, updatable = false)
private Team team;
}
@Entity
public class Team {
@Id
private Long id;
private String name;
@OneToMany
@JoinColumn(name = "team_id")
private List<Member> members;
}
// Member - 주 엔티티
// Locker - 대상 엔티티
@Entity
public class Member {
@Id
private Long id;
private String userName;
@OneToOne
private Locker locker;
}
@Entity
public class Locker {
@Id
private Long id;
private int number;
}
// Member - 주 엔티티
// Locker - 대상 엔티티
@Entity
public class Member {
@Id
private Long id;
private String userName;
@OneToOne
private Locker locker;
}
@Entity
public class Locker {
@Id
private Long id;
private int number;
@OneToOne(mappedby = "locker")
private Member member
}
// Member - 주 엔티티
// Locker - 대상 엔티티
@Entity
public class Member {
@Id
private Long id;
private String userName;
@OneToOne(mappedby = "member")
private Locker locker;
}
@Entity
public class Locker {
@Id
private Long id;
private int number;
@OneToOne
private Member member
}