2011-07-03 42 views
61

Có sự khác biệt nếu tôi sử dụng@OneToMany List <> vs Set <> khác biệt

@OneToMany 
public Set<Rating> ratings; 

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

@OneToMany 
public List<Rating> ratings; 

cả việc OK, tôi biết sự khác biệt giữa danh sách và một bộ , tuy nhiên tôi không biết nếu điều này làm cho bất kỳ sự khác biệt như thế nào hibernate (hoặc thay JPA 2.0) xử lý nó.

Trả lời

77

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 của Hibernate (không có thứ tự cụ thể).

Một 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 thực thể Person 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 đơn lẻ để tải những người có tất cả liên hệ của 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 Descartes) hoặc sử dụng Set thay vì List cho ít nhất một trong các bộ sưu tập. Bạn thường khó sử dụng Bộ với Hibernate khi bạn phải xác định equalshashCode trên các thực thể và không có khóa chức năng bất biến trong thực thể.

+1

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

26

Nếu bạn sử dụng Danh sách, 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, danh sách sẽ được sắp xếp theo thứ tự tăng dần dựa trên giá trị của khóa chính.

+12

Vì nó gửi cho tôi xáo trộn cho tài liệu Hibernate của tôi: bạn * có thể * '@ Sort' một tập hợp - chỉ cần sử dụng' SortedSet' như được giải thích [trong tài liệu] (http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single/# collections-sort). – mabi

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