🍀Spring/JPA

[JPA] 연관관계 매핑 - 단방향 연관관계

말동말동현 2024. 7. 6. 12:32

방향(Direction) : 단방향, 양방향

다중성(Multiplicity)  : 다대일 (N:1) , 일대다 (1:N) , 일대일 (1:1) , 다대다 (N:M)

연관관계의 주인(Owner) : 객체 양방향 연관관계는 관리 주인이 필요

 

 

 

 

객체를 테이블에 맞추어 모델링 (참조 대신에 외래 키를 그대로 사용)

 

@Entity
     public class Member { 
     @Id @GeneratedValue
     private Long id;
     @Column(name = "USERNAME")
     private String name;
     @Column(name = "TEAM_ID")
     private Long teamId; 
     … 
     } 
 @Entity
 public class Team {
     @Id @GeneratedValue
     private Long id;
     private String name; 
     … 
 }

 

객체를 테이블에 맞추어 모델링 (외래 키 식별자를 직접 다룸)

//팀 저장
 Team team = new Team();
 team.setName("TeamA");
 em.persist(team);
 //회원 저장
 Member member = new Member();
 member.setName("member1");
 member.setTeamId(team.getId());
 em.persist(member);

 

//조회
 Member findMember = em.find(Member.class, member.getId()); 
 //연관관계가 없음
 Team findTeam = em.find(Team.class, team.getId());

 

-> 객체 지향적인 방법이 아니다.

 

 

단방향 연관관계

 

 @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;
 	@ManyToOne
 	@JoinColumn(name = "TEAM_ID")
 	private Team team;
 …

@ManyToOne과 @JoinColumn을 사용하여 연관관계 매핑을 해주면

 //팀 저장
 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();

과 같이 객체지향적으로 나타낼 수 있다.