@OneToMany List <> so với Set <> chênh lệch


94

Có sự khác biệt nào nếu tôi sử dụng

@OneToMany
public Set<Rating> ratings;

hoặc nếu tôi sử dụng

@OneToMany
public List<Rating> ratings;

cả hai đều hoạt động OK, tôi biết sự khác biệt giữa danh sách và tập hợp, tuy nhiên tôi không biết liệu điều này có tạo ra bất kỳ sự khác biệt nào về cách hibernate (hay đúng hơn là JPA 2.0) xử lý nó hay không.

Câu trả lời:


109

Một danh sách, nếu không có cột chỉ mục được chỉ định, sẽ chỉ được xử lý như một túi bởi Hibernate (không có thứ tự cụ thể).

Một điểm khác biệt đáng chú ý trong việc xử lý Hibernate là bạn không thể tìm nạp hai danh sách khác nhau trong một truy vấn. Ví dụ: nếu bạn có một Personthực thể có danh sách liên hệ và danh sách địa chỉ, bạn sẽ không thể sử dụng một truy vấn duy nhất để tải những người có tất cả liên hệ và tất cả địa chỉ của họ. Giải pháp trong trường hợp này là thực hiện hai truy vấn (tránh sản phẩm cacte) hoặc sử dụng Setthay vì a Listcho ít nhất một trong các tập hợp.

Thường khó sử dụng Bộ với Hibernate khi bạn phải xác định equalshashCodetrên các thực thể và không có khóa chức năng bất biến trong thực thể.


3
Và để biết chi tiết về những gì xảy ra với danh sách, hãy xem stackoverflow.com/q/1995080/2495717 .
ben3000

31

Nếu bạn sử dụng Danh sách, thì bạn có thể chỉ định mệnh đề 'Đặt hàng BY' trong hàm getter. Bạn không thể làm điều đó với một Set. Thứ tự theo mệnh đề có thể chứa một phần EJBQL; Ví dụ

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

Nếu bạn để trống trường này, thì danh sách được sắp xếp theo thứ tự tăng dần dựa trên giá trị của khóa chính.


19
Vì nó khiến tôi xáo trộn các tài liệu Hibernate của mình: bạn có thể @Sort một bộ - chỉ cần sử dụng SortedSetnhư được giải thích trong tài liệu .
mabi,

nhưng nếu bạn sử dụng SortedSet, nó sẽ sắp xếp bằng bộ so sánh, không có cách nào khiến nó được sắp xếp theo thứ tự của cơ sở dữ liệu.
samir105

Vì nó là câu trả lời cũ, tôi muốn làm rõ nó. Hiện tại chúng tôi CÓ THỂ sử dụng @OrderBytrên Set. Bên dưới, Hibernate sẽ sử dụng OrderedSetTypesẽ khởi tạo a LinkedHashSet, do đó, thứ tự được giữ nguyên. Ngoài ra, tôi sẽ đề nghị sử dụng LinkedHashSettrong thực thể - vì lợi ích nhất quán. Nguồn: discourse.hibernate.org/t/…
Martin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.