ecsimsw
JPA / 연관 관계 매핑 / 단방향 매핑 본문
"T아카데미 / JPA 프로그래밍 기본기 다지기 - 김영한 " 강좌를 듣고 정리한 글입니다.
연관 관계 매핑
1. 데이터 중심 모델링
아래 Member와 Team의 구조를 보자.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name= "TEAM_ID")
private long teamId;
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
}
위 설계처럼 기존의 데이터 중심 모델링으로 멤버에 대한 Team 객체를 얻고자 한다면,
다음처럼 member.TeamId를 뽑고, 엔티티매니저에서 그 teamId에 해당하는 Team 객체를 찾아야할 것이다.
Member와 Team은 사실 연관관계가 없기 때문이다.
Member memberA = em.find(Member.class, member.getId());
Long teamId = memberA.getTeamId();
Team teamA = em.find(Team.class, teamId);
2. 단방향 매핑 / 객체 지향 모델링
Member에 해당하는 Team 매핑은 가능하나, Team에 해당하는 Member는 매핑할 수 없다.
이런 구조를 단방향 매핑이라고 한다.
이 둘을 @JoinColumn을 사용하면 보다 객체 중심적으로 모델링이 가능하다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
}
// member.setTeam(team); 멤버를 persist할 때도 team을 집접 넣음
Member memberA = em.find(Member.class, member.getId());
Team teamA = memberA.getTeam();
@JoinColumn : 객체의 참조와 테이블 외래 키를 매핑한다.
3. 지연 로딩 (FetchType = Lazy)
Member안의 Team 객체의 로딩을 실제로 Team이 실제로 사용될 때로 지연하도록 하려면 FetchType을 바꾸면 된다.
대부분의 경우에서 지연 로딩이 더 유리하다.
//default : FetchType.EAGER
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="TEAM_ID")
private Team team;
'Database > JPA, ORM' 카테고리의 다른 글
JPA / 영속성 컨텍스트 / 엔티티 생명 주기 (0) | 2020.06.28 |
---|---|
JPA / 연관관계 매핑 / 양방향 매핑 / MappedBy (2) | 2020.06.26 |
JPA / 기본 키 매핑 (0) | 2020.06.26 |
JPA / 필드와 컬럼 매핑 (0) | 2020.06.25 |
JPA / EntitiyManager (0) | 2020.06.25 |
Comments