[객체 관계 매핑]
1. 단방향 연관관계 : 다대일 (객체 연관관계에서 Team은 User를 알 수 없다.)
@Entity
public class Team(){
@Id
@Column(name="TEAM_ID")
private String id;
private String name;
...(Getter, Setter)
}
@Entity
public class User(){
@Id
@Column(name="ID")
private String id;
@Column(name="USER_NAME")
private String userName;
//다대일 연관관계
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team
public void setTeam(Team team){
this.team = team;
}
...(Getter, Setter)
}
▶ 객체 연관관계 : 회원 객체의 User.level 필드 사용
Team 객체에서는 User를 찾을 수 없으므로 단방향 조회
▶ 테이블 연관관계 : 회원 테이블의 USER.TEAM_ID 외래키 컬럼 사용
TEAM 테이블에서는 TEAM_ID라는 외래키로 양방향 조회가 가능
2. 조회
▶ 연관관계가 있는 엔티티 조회 방법
ㆍ객체 그래프 탐색(객체 연관관계를 사용한 조회)
User user = manager.find(User.Class, "studyjpa");
Team team = user.getTeam();
ㆍ객체지향 쿼리(JPQL) 사용
String jpql = "SELECT u FROM User AS u JOIN u.team AS t WHERE t.name =: teamName";
List<User> userList = manager.createQuery(jpql, User.class)
.setParameter("teamName", "청팀")
.getResultList();
3. 양방향 연관관계
@Entity
public class Memeber{
@Id
@Column(name="MEMEBER_ID")
private String id;
private String username;
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
public void setTeam(Team team){
this.team = team;
}
... Getter&Setter
}
@Entity
public class Team{
@Id
@Column(name="TEAM_ID")
private String id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>();
... Getter&Setter
}
▶ mappedBy 속성은 양방향 매핑일 때 사용, 반대쪽 매핑의 필드 이름을 주면 된다.
▶ 객체에는 양방향 연관관계라는 것이 없다.
단방향 연관관계 2개를 애플리케이션 로직으로 잘 묶어서 양방향인 것처럼 보이게 할 뿐.
▶ 테이블은 외래 키 하나로 양방향 연관관계를 맺는다.
▶ 양방향 연관관계 매핑 시 두 연관관계 중 하나를 연관관계의 주인으로 정해야 한다.
주인 : DB 연관관계와 매핑되고 외래 키 관리(등록, 수정, 삭제)
mappedBy 속성 사용 X
FK가 있는 테이블 (DB 일대다 관계에서는 항상 다 쪽이 FK를 가진다.)
주인X : 읽기만 가능
mappedBy 속성을 사용해서 연관관계의 주인을 지정
'Jpa' 카테고리의 다른 글
Entity & Dto (0) | 2024.01.18 |
---|---|
번외. QueryDSL & JPA (0) | 2023.01.19 |
4. 엔티티 매핑 (0) | 2023.01.19 |
3. 영속성(Persistence) 관리 (0) | 2023.01.19 |
2. JPA 설정 및 객체 매핑, 기본 어플리케이션 세팅 (0) | 2023.01.19 |