2013-01-01 4 views
26

푸 가지고@ManyToMany은 (mappedBy = "foo는")

@ManyToMany(mappedBy = "foos") 
private Set<Bar> bars 

과 바 가지고

@ManyToMany 
private Set<Foo> foos 
mappedBy의 위치 양방향 관계 확인 속성 무엇 차이

다른 table이 foo_bar 또는 bar_foo로 불려지는 것보다; mappedBy 특성이 없으면 foo_bar와 bar_foo의 두 조인 테이블을 얻습니다.

+2

foo와 bar는 실제로이 단어에 대한 가난한 선택입니다. 현실 세계에 존재하는 관계에 대한 구체적인 예를 고려해보십시오. – haventchecked

답변

36

The documentation 말한다 : 연관이 양방향

경우, 한쪽은 소유자에게 한쪽은 (연관의 관계 값을 갱신 할 때, 즉 그것이 무시 될 역 종료되어야한다. 표) :

따라서, mappedBy 속성을 갖는면이 반대면입니다. mappedBy 속성이없는 쪽이 소유자입니다.

소유자 측은 Hibernate가 어떤 연관이 있는지를 알기 위해 보는면이다. 그래서, 예를 들어, Foo를 Bar의 모음 집합에 추가하면 Hibernate가 조인 테이블에 삽입 할 새로운 행이 생깁니다. 반대로, Foo 막대 세트에 막대를 추가하면 데이터베이스에서 아무 것도 수정되지 않습니다.

+0

DB를 수정해야하는 바가 추가되면 서로를 반영하고 싶습니다. – NimChimpsky

+0

@NimChimpsky : 양방향 관계에서 Foo.bars를 변경하면 Bar.foos도 그에 따라 변경되어야하므로 수정할 때 DB에 저장되는 내용에 신경 쓰지 않아야합니다. "소유권"개념은 데이터베이스 구성에 관한 것일 뿐이며 코드는 완전히 알지 못합니다. –

+0

양방향 연관이 있습니다. foo에 막대를 추가 할 때 bar에도 foo를 추가하십시오. –

1

mappedBy은 관계의 어느 쪽이 링크를 "소유"하는지 Hibernate에게 알린다. OneToMany 또는 OneToOne에서, mappyedBy을 사용하면 Hibernate에게 링크 저장에 사용될 외래 키가 다른 테이블에 있음을 알린다.

ManyToMany의 경우 조인 테이블이 있으므로 다른 개체에 대한 링크도 직접 없습니다. 그러나 최대 절전 모드는 작업을 계단식으로 연결하는 방법을 알고있는 "소유"측면이 무엇인지 파악해야합니다.

+1

-1 : mappedBy는 외부 키가있는 테이블을 나타내지 않으며 계단식과 관련이 없습니다. –

관련 문제