Jpa

5. 연관관계 매핑

배고픈 징징이 ㅣ 2023. 1. 19. 14:24

[객체 관계 매핑]

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