2013-04-20 5 views
25

나는 현재 entity associations에 관한 Hibernate의 문서를 읽고 있는데, 약간의 어려움을 알아 내기 위해 약간의 어려움이있다. 그것은 본질적으로 ManyToOneOneToMany 연관의 차이와 관련이 있습니다. 내가 실제 프로젝트에서 사용했지만, 나는 그들 사이의 차이점을 완전히 파악할 수 없다. 필자의 이해를 돕기 위해 테이블 ​​/ 엔티티가 ManyToOne을 다른 테이블과 연관 시킨다면, 그 연관은 다른 쪽의 테이블이어야한다. OneToMany. 그렇다면 특정 사례를 기반으로 선택할 대상을 어떻게 결정해야하며 데이터베이스/쿼리/결과에 어떤 영향을 미치나요? 어디 에나 좋은 모범이 있습니까?Hibernate/JPA ManyToOne 대 OneToMany

추신 : 다른 사람이 협회 소유자의 입장과 양방향 및 단방향 연결의 차이점을 설명 할 수 있다면 질문과의 관련성으로 인해 도움이 될 것으로 생각합니다.

답변

43

주문 및 주문 회선이 있다고 가정합니다. Order와 OrderLine 사이에 단방향 OneToMany를 갖도록 선택할 수 있습니다 (Order에는 OrderLine 컬렉션이 있습니다). 또는 OrderLine과 Order (OrderLine은 Order에 대한 참조가 있음)간에 ManyToOne 연관을 선택할 수 있습니다. 또는 두 가지를 모두 선택할 수 있습니다.이 경우 연결은 양방향 OneToMany/ManyToOne 연결이됩니다.

귀하가 선택하는 해결책은 주로 상황과 엔티티 간의 연결 수준에 따라 다릅니다. 예를 들어 사용자, 회사, 제공 업체 모두에 많은 주소가있는 경우 모든 주소와 주소 사이에 단방향을 사용하고 주소에 자신의 소유자를 알지 못하게하는 것이 좋습니다.

사용자와 메시지가있는 경우 사용자가 수천 개의 메시지를 가질 수 있다고 가정하면 메시지의 사용자에게 메시지를 거의 요구하지 않기 때문에 메시지에서 사용자까지 ManyToOne로만 모델링하는 것이 좋습니다. 어쨌든 사용자. JPQL 쿼리는 엔티티간에 연결을 통해 조인하므로 쿼리를 지원할 때만 연결을 양방향으로 만들 수 있습니다.

양방향 연관에서 개체 그래프에 일관성이없는 상황이 발생할 수 있습니다. 예를 들어, Order A에는 OrderLines의 빈 세트가 있지만 일부 OrderLines에는 Order A에 대한 참조가 있습니다. JPA는 항상 연관의 한면을 소유자면으로하고 다른면을 반대면으로 지정합니다. JPA는 반대면을 무시합니다. 소유자 측은 어떤 관계가 존재하는지 결정하는 측입니다. OneToMany 양방향 연관에서 소유자 측은 많은면이 있어야합니다. 앞의 예에서 소유자 측은 OrderLine이되며 JPA는 행과 A 사이의 연결을 유지합니다.

이러한 연결은 다음과 같이 매핑됩니다. 주문에

: OrderLine에있는

@OneToMany(mappedBy = "parentOrder") // mappedBy indicates that this side is the 
    // inverse side, and that the mapping is defined by the attribute parentOrder 
    // at the other side of the association. 
private Set<OrderLine> lines; 

: 또한

@ManyToOne 
private Order parentOrder; 
1

소유자 만, N + 1 Q를 필요로 @ManytoOne 측면을 갖는 asseries를 저장하는 동안 ueries. 여기서 n은 연관의 수 (많은면)입니다.

소유자로 @OneToMany이있는 반면, 연관이있는 상위 엔티티 (한쪽)를 삽입하는 동안 2 * N + 1 개의 쿼리가 발생합니다. 하나의 질의는 연관의 삽입을위한 것이고 다른 질의는 연관된 엔티티의 외래 키를 갱신하는 것이다.

관련 문제