2011-11-19 1 views
7

@OneToMany@ManyToMany의 차이를 이해하는 데 약간의 문제가 있습니다. @OneToMany을 사용하면 기본적으로 JoinTable을 만들고 mappedBy 속성을 추가하면 두 엔티티간에 양방향 관계가 생깁니다.@OneToMany와 @ManyToMany의 차이점

나는 Categories에 속할 수있는 Question이며, 하나는 Category이고, 많은 숫자는 Questions입니다. 나에게 @ManyToMany 또는 @OneToMany을 사용해야하는지 이해하지 못한다. 왜냐하면 나에게는 똑같은 것으로 보이기 때문이다.

누군가 설명 할 수 있습니까?

답변

15

글쎄, 차이점은 객체를 사용하여 반영하려는 디자인에 있습니다.

귀하의 경우 모든 QuestionCategories에 할당 될 수 있습니다. 따라서 @*ToMany의 기호입니다. 이제 여부를 결정해야한다 :

  • Category 단 하나의 Question이 (가 다른 종류가 같은 질문를 참조 할 수 없음을 의미 독특한 제약을 초래할 것)에 할당 할 수 있습니다 -이 것 이 @ManyToMany 관계가 될 것입니다 - 각 Category이 할당 여러 Questions을 가질 수
  • @OneToMany 관계가 될합니다 (Category 테이블에 고유 제한 조건이있을 수 없습니다).

@OneToMany (질문 -> 카테고리)

이 관계는 명시 적 @JoinTable를 사용하여 이렇게 정의하거나 경우에만 테이블을 조인으로 표현 될 수있다

그것은 단방향 관계가있을 때 어떤 소유 측면에서 '한쪽'입니다 (Categories의 컬렉션이있는 Question 엔티티에 있지만 Categories에는 Question에 대한 참조가 없음).

생각해 보면 조인 테이블이 사용되는 것이 합리적입니다. DBMS가 Categories 테이블에 복수 행이있는 Question 테이블의 한 행 사이의 연결을 저장할 수있는 다른 방법은 없습니다.

그러나 양방향 관계를 모델링하려면 Category ('Many'면)이 관계의 소유 면임을 지정해야합니다.이 경우 Category 행에 각각 Question 만 연결할 수 있기 때문에 DBMS는 Category 테이블에 외래 키가있는 조인 열을 만들 수 있습니다.

이렇게하면 조인 테이블이 아닌 단순 외래 키 (여전히 시작 부분이 가리키는 것처럼 @JoinTable을 사용하여 조인 테이블을 만들 수 있습니다). 이 관계 조인 테이블로 표현되어야

@ManyToMany. 기본적으로 단방향 @OneToMany 관계와 매우 유사하게 작동하지만이 경우 Categories에서 여러 행으로 결합 된 Question의 행이 여러 개있을 수 있습니다.

+0

대단한 설명. 더 많은 upvotes가 있어야합니다. – LppEdd

0

@ManyToMany 관계에는 관계의 양면에 상호 참조 외래 키가 있습니다. 때로는이 관계는 인접한 테이블에 의해 조정됩니다.

@OneToMany 관계에는 "하나"면에 외래 키가 있고 "many"면에는 외래 키가 있습니다. @OneToMany 관계에서 하나의 객체는 "부모"이고 하나는 "자식"입니다. 부모는 자녀의 존재를 통제합니다.

@ManyToMany 양방향 관계가 대칭 일 필요는 없습니다.

0

귀하의 질문에 & 카테고리의 경우 @ManyToMany 관계를 사용해야합니다. @ManyToMany는 기본적으로 "질문은 동시에 많은 카테고리에 속할 수 있습니다"및 "카테고리에는 많은 질문이 동시에 포함될 수 있음"을 의미합니다. 매핑을 저장하기 위해 새 테이블이 자동으로 만들어집니다. 귀하의 코드는 다음과 같습니다

@Entity 
public class Question implements Serializable { 
    ... 
    @ManyToMany 
    private List<Category> categories; 
    ... 
} 

@Entity 
public class Category implements Serializable { 
    ... 
    @ManyToMany 
    private List<Question> questions; 
    ... 
} 

당신이 당신의 질문과 카테고리에 대한 @OneToMany 관계를 사용하는 경우, 이것은 질문 만에 속할 수 "있다는 것을 의미 (의이 한쪽에 및 다른 질문에 대한 카테고리 가정 해 봅시다) 하나의 카테고리 "와"카테고리는 동시에 많은 질문을 포함 할 수 있습니다 ". 매핑을 저장하는 데 새 테이블이 필요하지 않습니다. 대신, 한 쪽의 ID를 기록하기 위해 많은 쪽에서 새로운 필드가 자동으로 만들어집니다. 귀하의 코드는 다음과 같습니다 :

@Entity 
public class Question implements Serializable { 
    ... 
    @ManyToOne 
    private Category theCategory; 
    ... 
} 

@Entity 
public class Category implements Serializable { 
    ... 
    @OneToMany(mappedBy="theCategory") 
    private List<Question> questions; 
    ... 
}