연관관계 매핑

2022. 1. 25. 16:14
반응형

단방향 연관관계

  • 객체 관점
    • 한쪽 객체에서만 참조가 가능
    • 다른 한쪽 객체에서는 참조가 불가능한 관계
  • 테이블 관점
    • 한쪽 테이블에서 다른 한쪽 테이블의 FK를 가지고 있음
    • FK를 통해 같이 조회가 가능
@Entity
public class Member {
	@Id @GeneratedValue
    private Long id;
    
    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;
}
@Entity
public class Team {
    @Id @GeneratedValue
    @Column(name = "team_id")
    private Long id;
}

양방향 연관관계

  • 객체 관점
    • 양쪽 객체에서 모두 참조가능
    • 한쪽 객체에서 연관관계의 주인이 된다.
  • 테이블 관점
    • 단방향 연관관계와 동일하다.
@Entity
public class Member {
	@Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    
    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;
}
@Entity
public class Team {
	@Id @GeneratedValue
    @Column(name = "team_id")
    private Long id;
    
    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}

양방향 연관관계 특징

  • 반드시 연관관계 주인이 있어야 한다.
  • 외래키가 있는 곳을 주인으로 설정해야 한다.
  • 연관관계 주인이 데이터를 수정, 삭제를 할 수 있다.
  • 연관관계 주인이 아닌 다른쪽은 읽기(조회)만 가능하다.

양방향 연관관계 주의사항

  • 연관관계 주인이 아닌곳에만 연관관계를 설정하면 엔티티를 영속화할 때 값이 들어가지 않는다!
Team team = new Team();
em.persist(team);

Member member = new Member();
team.getMembers().add(member);	//연관관계 주인이 아닌곳에만 연관관계 설정!

em.persist(member);
  • 연관관계 주인한테 연관관계를 설정해야한다!
  • 테이블이 아닌 객체의 관점에서 봤을때에는 양쪽 다 연관관계를 설정해야한다.
Team team = new Team();
em.persist(team);

Member member = new Member();
member.setTeam(team);			//연관관계 설정

team.getMembers().add(member);	//team에서 member를 조회하기 위한 객체 연관관계 설정

em.persist(member);

 

반응형

'JPA' 카테고리의 다른 글

값 타입  (0) 2022.02.02
프록시와 연관관계 관리  (0) 2022.02.02
상속관계 매핑과 @MappedSuperclass  (0) 2022.01.31
엔티티 매핑  (0) 2022.01.20
영속성 관리 - 영속성 컨텍스트  (0) 2021.05.17

BELATED ARTICLES

more