위에 그림을 보면 객체를 테이블에 맞추거 모델링 한 경우인데 현재 회사에서 주로하는 JPA를 사용하지않고 있어서 주로 하는 방법인데 김영한의 JPA강의를 듣고 뭔가 잘못된다는 것을 알게 되었습니다.
meber객체로 team정보를 찾으려고면 외래키를 직접 다루기 때문에 식별자로 한번더 조회를 해야 한다.
객제지향 방법과는 상당히 거리가 있다.
JPA를 사용하면 이런한 문제를 아주 쉽게 해결 할 수 있다. 바로 단방향 연관관계다.
테이블 설계는 위의 그림과 동일하다.
단방향
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
// @Column(name = "TEAM_ID")
// private Long teamId;
//member입장에서는 team은 ManyToOne 이다
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
public class Team {
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
}
이게 가능해진다.
//조회
Member findMember = em.find(Member.class, member.getId());
//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
양방향
member클래스 소스는 동일하다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
}
team으로도 memebr정보를 가져올수 있게 된다.
//조회
Team findTeam = em.find(Team.class, team.getId());
int memberSize = findTeam.getMembers().size(); //역방향 조회
양방향 매핑 규칙
• 객체의 두 관계중 하나를 연관관계의 주인으로 지정
• 연관관계의 주인만이 외래 키를 관리(등록, 수정) <-- 제일 많이 하는 실수
• 주인이 아닌쪽은 읽기만 가능
• 주인은 mappedBy 속성 사용X
• 주인이 아니면 mappedBy 속성으로 주인 지정
연관관계의 주인을 정하는 기준
• 비즈니스 로직을 기준으로 연관관계의 주인을 선택하면 안됨
• 연관관계의 주인은 외래 키의 위치를 기준으로 정해야함
출처 : 김영한의 JAP강의
'프레임워크 > JPA' 카테고리의 다른 글
[JPA] 임베디드 타입 (1) | 2023.05.01 |
---|---|
[JPA] 프록시와 연관관계(즉시로딩, 지연로딩, 영속성 전이) (0) | 2023.04.29 |
[JPA] 상속관계 매핑 (0) | 2023.04.23 |
[JPA] 다대일 [N:1] 일대일 [1:1] 다대다 [N:M] (0) | 2023.04.05 |
[JPA] JPA 영속성 관리 (0) | 2023.03.05 |