728x90

 

 

 

01. 간단한 용어 정리

 


방향 (Direction) : 단방향, 양방향
다중성 (Multiplicity) : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N)

연관관계의 주인 (Owner) : 객체 양항뱡 연관관계는 관리 주인이 필요하다.

 


 



02. 연관관계가 필요한 이유

 


객체를 테이블에 맞추어 모델링 하는 경우

  • 즉, 연관관계가 없는 객체를 말한다.
  • 이 경우, 참조 대신에 외래 키를 그대로 사용한다.
  • Entity는 다음과 같이 작성할 수 있다.
@Entity
@Getter
@Setter
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@Column(name = "TEAM_ID")
private Long teamId;
}

 

@Entity
@Getter
@Setter
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
}




다음은 JpaMain 클래스의 try문 안에 들어가는 내용이다.

  • 외래 키 식별자를 직접 다루기 때문에 식별자로 다시 조회하게 된다.
  • 이 방법은 객체지향적인 방법은 아니다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId()); // 이 부분에서 외래키 식별자를 직접 다룬다.




결론

  • 객체를 테이블에 맞추어 데이터 중심으로 모델링하면 협력 관계를 만들 수 없다.
  • 테이블외래 키로 조인을 사용하여 연관된 테이블을 찾고 객체참조를 사용하여 연관된 객체를 찾는다.
테이블과 객체 사이에는 이런 큰 간격이 있기 때문에 객체와 테이블 연관관계의 차이를 이해하고 객체의 참조와 테이블의 외래 키를 매핑할 줄 알아야 한다.

 

 

 


 



03. 단방향 연관관계

 


객체 지향 모델링을 하는 경우

  • 즉, 객체 연관관계를 사용하는 것을 말한다.
  • 하나의 Team에는 여러 명의 Member가 소속될 수 있다. 따라서 Team이 일, Member가 다 인 것이다.
  • Member와 Team의 연관관계는 다음과 같다.

 

 

  • 객체의 참조와 테이블의 외래 키를 매핑하면 그림과 코드는 다음과 같다. 

 

 

  • @ManyToOne으로 Team, Member 임을 명시한다.
@Entity
@Getter
@Setter
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;
}




저장

  • 저장 시에는 단방향 연관관계를 설정하고, 참조를 저장할 수 있다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team); // 단방향 연관관계 설정 및 참조 저장
em.persist(member);

 

  • 이후 H2 콘솔을 열고 join을 하면 다음과 같은 결과가 나온다.






조회

  • 참조로 연관관계를 조회할 수 있다.
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam(); // 참조를 사용해서 연관관계 조회




수정

  • 연관관계를 간단하게 수정할 수 있다.
  • DB에 id 값으로 100이 있음을 가정하고 작성한 코드이다.
Team newTeam = em.find(Team.class, 100L);
findMember.setTeam(newTeam);

 




 



04. 추가내용

 

 

저장할 때 em.flush(); 로 영속성 컨텍스트에 있는 쿼리문을 DB에 날려 sync를 맞추고, em.clear(); 로 영속성 컨텍스트를 초기화하면 쿼리문을 깔끔하게 볼 수 있다.

 

Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
em.persist(member);
em.flush();
em.clear();
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam();
System.out.println("findTeam = " + findTeam.getName());

 

 

728x90

'JPA' 카테고리의 다른 글

다양한 연관관계 매핑  (0) 2024.01.07
양방향 연관관계와 연관관계의 주인  (2) 2024.01.06
필드와 컬럼 매핑  (0) 2024.01.06
데이터베이스 스키마 자동 생성  (0) 2024.01.05
객체와 테이블 매핑  (1) 2024.01.02