2013-01-01 43 views
26

Foo có:@ManyToMany (mappedBy = "foo")

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

và Bar có:

@ManyToMany 
private Set<Foo> foos 

khác biệt gì vị trí của mappedBy thuộc tính thực hiện cho một mối quan hệ hai chiều, khác hơn bảng được gọi là foo_bar hay bar_foo; và không có thuộc tính mappedBy, tôi nhận được hai bảng tham gia, cả foo_bar và bar_foo.

+2

foo và bar thực sự là một sự lựa chọn của người nghèo từ này. Hãy xem xét các ví dụ cụ thể hơn với các mối quan hệ tồn tại trong thế giới thực. – haventchecked

Trả lời

36

The documentation nói:

Nếu hiệp hội là hai chiều, một bên phải là chủ sở hữu và một bên phải là sự kết thúc nghịch đảo (tức là nó sẽ bị bỏ qua khi cập nhật các giá trị mối quan hệ trong hiệp hội. bảng):

Vì vậy, cạnh có thuộc tính nghịch đảo là mappedBy. Phía không có thuộc tính mappedBy là chủ sở hữu.

Phía chủ sở hữu là bên mà Hibernate xem xét để biết liên kết nào tồn tại. Vì vậy, ví dụ, nếu bạn thêm một Foo tập hợp các foos của một Bar, một hàng mới sẽ được chèn bởi Hibernate trong bảng kết nối. Nếu ngược lại, bạn thêm một thanh vào tập hợp các thanh của một Foo, không có gì sẽ được sửa đổi trong cơ sở dữ liệu.

+0

nếu tôi muốn họ phản ánh lẫn nhau, nếu một thanh được thêm vào cũng nên sửa đổi db? – NimChimpsky

+0

@NimChimpsky: Trong một mối quan hệ hai chiều, khi bạn thay đổi Foo.bars, sau đó bạn nên thay đổi Bar.foos tương ứng, vì vậy bạn không nên quan tâm về những gì được lưu trong DB khi bạn sửa đổi những gì. Khái niệm "quyền sở hữu" chỉ là về tổ chức cơ sở dữ liệu và mã của bạn nên hoàn toàn không biết gì về nó. –

+0

Bạn có một liên kết hai chiều: khi bạn thêm một thanh vào một foo, hãy thêm foo vào thanh. –

1

mappedBy cho Hibernate biết khía cạnh của mối quan hệ "sở hữu" liên kết. Trong OneToMany hoặc OneToOne, sử dụng mappyedBy thông báo cho Hibernate rằng sẽ có khóa ngoại trong bảng khác sẽ được sử dụng để lưu trữ liên kết.

Khi nói đến ManyToMany, có một bảng tham gia, vì vậy không trực tiếp có liên kết đến đối tượng khác. Tuy nhiên, hibernate vẫn cần phải biết đó là "sở hữu" bên đó là biết làm thế nào để cascade hoạt động.

+1

-1: mappedBy không chỉ ra bảng nào có khoá ngoại, và nó không liên quan gì đến các tầng. –

Các vấn đề liên quan