(자바ORM) 양방향 매핑의 규칙
* 양방향 연관관계 매핑 시 지켜야 할 규칙이 있는데 두 연관관계 중 하나를 연관관계의 주인으로 정해야 한다.
연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래키를 관리(등록, 수정, 삭제) 할 수 있다. 반면에 주인이 아닌 쪽은 읽기만 할 수 있다.
어떤연관관계를 주인으로 정할지는 mappedby 속성을 사용하면 된다.
*MappedBy에 대한 설명
* 양방향은 외래 키가 있는 쪽인 연관관계의 주인이다.
-> 일대다와 다대일 연관관계는 항상 다(N)에 외래키가 있다. JPA는 외래 키를 관리할 때, 연관관계의 주인만 사용한다. 주인이 아닌 곳은 조회를 위한 탐색을 할때만 사용한다.
*일대다 단방향 관계를 매핑할 때는 @JoinColumn을 명시해야 한다. 그렇지 않으면 JPA는 연결 테이블을 중간에 두고 연관관계를 관리하는 조인테이블 전략을 기본으로 사용해서 매핑한다.
연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래키를 관리(등록, 수정, 삭제) 할 수 있다. 반면에 주인이 아닌 쪽은 읽기만 할 수 있다.
어떤연관관계를 주인으로 정할지는 mappedby 속성을 사용하면 된다.
- 주인은 mappedby 속성을 사용하지 않는다.
- 주인이 아니면 mappedby속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야 한다.
< 연관관계의 주인은 외래 키가 있는 곳>
예를들어) 회원과 팀 두 테이블의 관계에서 회원이 team이라는 객체를 참조하고 이것이 외래키이므로 이때 주인은 회원으로 한다.
대신 팀 테이블에서 List<Member> members; 에다가 @OneToMany(mappedby="team")을 해주어 자신이 주인이 아님을 표시한다.
< 양방향 연관관계의 주의점 >
양방향 연관관계를 설정하고 가장 흔히 하는 실수는 연관관계의 주인에는 값을 입력하지 않고, 주인이 아닌 곳에만 값을 입력하는 것이다. 데이터베이스에 외래 키 값이 정상적으로 저장되지 않으면 이것을 의심해보자.
*MappedBy에 대한 설명
->MappedBy signals hibernate that the key for the relationship is on the other side.
This means that although you link 2 tables together, only 1 of those tables has a foreign key constraint to the other one. MappedBy allows you to still link from the table not containing the constraint to the other table
* 양방향은 외래 키가 있는 쪽인 연관관계의 주인이다.
-> 일대다와 다대일 연관관계는 항상 다(N)에 외래키가 있다. JPA는 외래 키를 관리할 때, 연관관계의 주인만 사용한다. 주인이 아닌 곳은 조회를 위한 탐색을 할때만 사용한다.
*일대다 단방향 관계를 매핑할 때는 @JoinColumn을 명시해야 한다. 그렇지 않으면 JPA는 연결 테이블을 중간에 두고 연관관계를 관리하는 조인테이블 전략을 기본으로 사용해서 매핑한다.
댓글
댓글 쓰기