관리 메뉴

꿀맛코딩

연관관계 매핑 기초 본문

공부방/JPA

연관관계 매핑 기초

soycrab 2023. 2. 19. 23:08

객체를 테이블에 맞추어 데이터 중심으로 모델링 하면, 협력 관계를 만들 수 없다.

- 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.

- 객체는 참조를 사용해서 연관된 객체를 찾는다.

- 테이블과 객체 사이에는 이런 큰 간격이 있다.

 

단방향 연관관계 

 

객체 지향 모델링

(객체 연관관계 사용)

 

 

객체 지향 모델링

(객체의 참조와 테이블의 외래 키를 매핑 )

@Entity

public class Member {


private Long id;
 

@Column(name = "USERNAME")
 private String name;
 private int age;

@Column(name = "TEAM_ID")
 private Long teamId;

@ManyToOne

@JoinColumn(name = "TEAM_ID")

private Team team;
}

 

객체 지향 모델링

(ORM 매핑)

객체 지향 모델링

(연관관계 저장)

//팀 저장

Team team = new Team();

team.setName("TeamA");
 em.persist(team);



//회원 저장

Member member = new Member();
 member.setName("member1");

member.setTeam(team); //단방향 연관관계 설정, 참조 저장
 em.persist(member);

 

 

객체 지향 모델링

(참조로 연관관계 조회 - 객체 그래프 탐색)

 

//조회

Member findMember = em.find(Member.class, member.getId());
//참조를 사용해서 연관관계 조회

Team findTeam = findMember.getTeam();

 

객체 지향 모델링

(연관관계 수정)

// 새로운 팀B

Team teamB = new Team();
 teamB.setName("TeamB");
 em.persist(teamB);



// 회원1에 새로운 팀B 설정
 member.setTeam(teamB);

 

 

양방향 연관관계와 연관관계의 주인 

 

양방향 매핑 

 

양방향 매핑

(Member 엔티티는 단방향과 동일)

 

@Entity

public class Member {


private Long id;
 

@Column(name = "USERNAME")
 private String name;
 private int age;



@ManyToOne

@JoinColumn(name = "TEAM_ID")

private Team team;
 ......

 

 

양방향 매핑 

(Team 엔티티는 컬렉션 추가)

 

@Entity

public class Team {





private String name;



}
@Id @GeneratedValue
 private Long id;

@OneToMany(mappedBy = "team")

List<Member> members = new ArrayList<Member>();
 ...

 

양방향 매핑

(반대 방향으로 객체 그래프 탐색)

//조회

Team findTeam = em.find(Team.class, team.getId());


int memberSize = findTeam.getMembers().size(); //역방향 조회

 

연관관계의 주인과 mappedBy

둘중 주인은?

- 외래 키가 있는 곳을 주인으로 정해야함

- 여기서는 Member.team 이 연관관계의 주인

양방향 매핑시 가장 많이 하는 실수 

(연관관계의 주인에 값을 입력하지 않음) 

Team team = new Team();
team.setName("TeamA");
em.persist(team);

Member member = new Member();
member.setName("member1");


//역방향(주인이 아닌 방향)만 연관관계 설정 
team.getMembers().add(member);
em.persist(member);

 

양방향 매핑시 연관관계의 주인에 값을 입력 해야 한다. 

(순수한 객체 관계를 고려하면 항상 양쪽다 값을 입력 해야 한다.)

Team team = new Team(); 
team.setName("TeamA"); 
em.persist(team);

Member member = new Member(); 
member.setName("member1");
member.setTeam(team); //중요

team.getMembers().add(member); //연관관계의 주인에 값 설정 (읽기 전용 값이라 실제로 쿼리가 날라가지 않음)

em.persist(member);

 

 

반응형

'공부방 > JPA' 카테고리의 다른 글

고급 매핑  (0) 2023.03.04
다양한 연관관계 매핑  (0) 2023.02.22
엔티티 매핑  (0) 2023.02.18
준영속 상태  (0) 2023.02.13
영속성 컨텍스트  (0) 2023.02.12
Comments