2017-12-15 35 views
0

@OneToManymappedBy 요소가 지정되지 않은 경우, 기본적으로 annotation은 조인 테이블을 만듭니다.왜 Hibernate는 @OneToMany에 대해 기본적으로 Join Table을 생성합니까?

이 동작의 이유는 무엇입니까? 다음 기관과 예를 들면 다음과 같습니다 User 엔티티에 대한

@Entity 
public class User { 
    // ... 
    @OneToMany 
    private List<UserDocument> documents; 
    // ... 
} 

@Entity 
public class UserDocument { 
    // ... 
    @ManyToOne 
    private User user; 
    // ... 
} 

, 왜 단순히 최대 절전 모드하지 않습니다

  1. UserDocument 개체에 반사를 수행하여 UserDocument 입력 User와 필드를 찾을 수 있습니다.
  2. @OneToMany 주석에 대해 mappedBy 값을 단독으로 추정 하시겠습니까?

기본 동작으로이 작업을 수행하지 않고 조인 테이블을 생성하는 이유는 무엇입니까? 왜 Hibernate (또는 JPA)가 이런 식으로 설계 되었습니까? UserDocument 관계 -

+0

안녕하세요. @OneToMany 주석에 대해 mappedBy의 값을 추론한다는 것은 무엇을 의미합니까? 또한 Hibernate가 엔티티 (id)를 계산한다는 의미에서 디자인을 만드는 것, 즉 join 대 vs "find"/ infer를 생성한다는 의미에서 Hibernate가 "수행 중"이라고 말할 때 명확하지 않습니다. 더 명확하게 편집하십시오. 모든 것을 분명하게 나타 내기에 충분한 단어와 문장을 사용하십시오. 추신 : 대답은 테이블에 대한 추상 작업과 특정 작업에서 구현 된 방법 (조합)을 구별하는 것입니다. 또한 주석 당 문서 매핑 모델을 테이블로 읽어보십시오. – philipxy

+0

왜 JPA SPEC에서 1-N의 기본값으로 지정해야합니까? 왜냐하면 그렇게합니다. JPA 스펙을 읽으십시오. 그것은 "mappedBy"와는 아무런 관련이 없습니다. 이것은 @ JoinColumn이 없기 때문입니다. – DN1

+0

@philipxy 나는 디자인 결정에 대해 이야기하고 있습니다. 왜 Hibernate (또는 오히려 JPA)가 이런 식으로 디자인 되었는가? – Utku

답변

3

이 뒤에 간단한 이유는이 특정 User에 대응 UserDocument의 내부 유형 User의 제기 것을 Hibernate는 확실히 알려져 있지 수 있다는 것입니다. mappedBy 프로퍼티가 없으면 Hibernate는 조인 테이블을 생성하거나 UserDocument 테이블에 생성 된 컬럼을 삽입 할 수있다. 그러나 후자는 데이터 모델을 변경하고 해결할 수있는 것보다 많은 문제를 발생시킵니다 (생성 된 또는 선언 된 열, 테이블 스키마 불일치 모델 클래스 등을 구별합니다). 따라서 Hibernate는 조인 테이블을 사용하여 매핑을 저장한다.

예를 들어, 문서를 마지막으로 수정 한 사람을 추적하려면 UserDocument에 다른 다 대일 관계가 필요할 수 있습니다. 이것은 반영을 사용하여 추측되고 해결 될 수 없습니다.

@Entity 
public class UserDocument { 
    // ... 
    @ManyToOne 
    private User user; 

    @ManyToOne 
    private User lastModifiedBy; 
    // ... 
}