Danh sách so với Đặt và Túi trong NHibernate


109

Sự khác biệt giữa danh sách, tập hợp và túi trong tệp ánh xạ NHibernate là gì? Làm thế nào để mỗi liên quan đến bộ sưu tập .NET?

Câu trả lời:


230

Ngữ nghĩa NHibernate:

  1. Danh sách: Tập hợp các thực thể có thứ tự, được phép trùng lặp. Sử dụng .NET IListtrong mã. Cột chỉ mục sẽ cần được ánh xạ trong NHibernate.

  2. Tập hợp: Tập hợp các thực thể duy nhất không theo thứ tự, không được phép trùng lặp. Sử dụng Iesi.Collection.ISettrong mã (NH trước v4) hoặc System.Collections.Generic.ISet(NH v4 +). Điều quan trọng là phải ghi đè GetHashCodeEqualschỉ ra định nghĩa kinh doanh của trùng lặp. Có thể được sắp xếp bằng cách xác định một thứ tự hoặc bằng cách xác định một trình so sánh dẫn đến một SortedSetkết quả.

  3. Túi: Danh sách thực thể không theo thứ tự, được phép trùng lặp. Sử dụng .NET ICollection<T>trong mã. Cột chỉ mục của danh sách không được ánh xạ và không được NHibernate tôn vinh.


Re: # 2, chúng ta không thể sử dụng chỉ thông thường ISetthay vì Iesi?
Sergei Tachenov

@SergeyTachenov: xem stackoverflow.com/questions/9222058/… để có câu trả lời khả thi. Khi câu trả lời này đã được viết ISET không phải là một phần của .net
Michael Gattuso

Câu trả lời ít phổ biến nhất cho câu hỏi đó là có, kể từ NHibernate 4. Vì vậy, có lẽ câu hỏi này cũng cần được chỉnh sửa.
Sergei Tachenov

21

Tất cả các đối tượng này trong NHibernate hoàn toàn giống với các cách triển khai khác của các Kiểu dữ liệu trừu tượng (ADT) này. Tôi đã rất ngạc nhiên về việc tìm Bộ và Túi trực tuyến khó như thế nào vì các tên gọi khác thường gặp như thế nào, vì vậy tôi đã liệt kê một số liên kết và mô tả ở đây.

Để biết thêm thông tin chi tiết, hãy xem phần sau: Danh sách , BộTúi

Các quy tắc chung là:

Các danh sách được sắp xếp theo thứ tự mặc định, hãy sử dụng các danh sách này nếu bạn muốn có thể lấy ra một đối tượng theo chỉ mục của nó hoặc bạn có sở thích kỳ lạ với forcác vòng lặp qua foreachcác vòng lặp. Bạn không bắt buộc phải truy cập chúng theo thứ tự như bạn cần trong Danh sách liên kết . ADT này cho phép trùng lặp.

Xin lưu ý! Mặc dù các danh sách được sắp xếp theo thứ tự như BryanD đã đề cập trong câu trả lời của mình, nhưng hoàn toàn không có gì nói rằng nó phải theo thứ tự bạn mong đợi từ cơ sở dữ liệu khi bạn thực hiện truy vấn HQL trừ khi bạn chỉ định thứ tự bằng lệnh. Đó là vì điều này mà một số người thích sử dụng Set hoặc Túi thay thế, để nó không tạo ra ảo giác như được đặt hàng. Mặc dù tôi nói điều này, hầu hết thời gian chúng sẽ xuất hiện theo thứ tự hiển thị, vì chúng được thêm vào danh sách theo thứ tự được tìm thấy trong truy vấn NHibernate chạy.

Bộkhông theo mặc định đặt hàng, bạn không thể truy cập vào bất kỳ biến trực tiếp thông qua một chỉ mục. Các bộ theo mặc định là ADT duy nhất trong số ba bộ ở trên duy trì tính duy nhất của các đối tượng của nó . Đây là những điều tuyệt vời nếu bạn có một bộ sưu tập nếu bạn yêu cầu không chứa các bản sao.

Túi (hoặc Bộ nhiều ), như bạn có thể thấy từ các liên kết ở trên, một loại Bộ cho phép các đối tượng bên trong nó là bản sao của các đối tượng khác. Chúng thường không được sử dụng, vì thứ tự Danh sách có thể bị bỏ qua và do đó được coi như một Túi.

Liên quan đến cách chúng được sử dụng trong NHibernate, không có gì được lấy từ cơ sở dữ liệu một cách khác nhau tùy thuộc vào ADT bạn chọn ở đây, chính những gì bạn muốn sử dụng nó sẽ khiến bạn chọn ADT khác nhau.

Cá nhân tôi sử dụng Bộ cho hầu hết mọi thứ vì tôi thường yêu cầu các đối tượng con phải là duy nhất và thứ tự không phải là một vấn đề. Mặc dù tôi sẽ sử dụng Danh sách trong đó tôi có một nhóm các đối tượng mà tôi muốn sắp xếp theo thứ tự, chẳng hạn như thời gian, để đạt được thứ tự này, tôi cần đặt thủ công "thứ tự theo" trong truy vấn HQL.


2
Chỉnh sửa trên Danh sách - sử dụng danh sách trong tệp ánh xạ NHibernate SẼ yêu cầu ánh xạ cột chỉ mục. Bằng cách này, danh sách sẽ được kéo ra theo thứ tự chính xác nó đã được đưa vào.
Michael Gattuso

@Michael Gattuso Điểm tốt, tôi nên đề cập trong câu trả lời ở trên rằng tôi đang nói về các truy vấn HQL (do đó là nhận xét 'đặt hàng theo') hơn là đặc tả bộ sưu tập thực tế trong tệp ánh xạ của bạn.
Jay

Một lợi ích của việc sử dụng túi là chúng không phải được tải từ cơ sở dữ liệu khi bạn thêm các phần tử mới vào đó. Không có bản sao để kiểm tra, không có thứ tự để xác định.
tvaananen

1

Chà, sự khác biệt cơ bản là danh sách có thứ tự ngầm định đối với các phần tử, được lập chỉ mục theo vị trí của chúng trong danh sách. Bộ và túi cũng có thể được "đặt hàng" thường bởi Bộ so sánh hoặc đặt hàng theo mệnh đề được áp dụng khi các mặt hàng đó ra khỏi DB. Cá nhân tôi, tôi chưa bao giờ sử dụng Túi ... nếu tôi biết dữ liệu tôi muốn được sắp xếp theo thứ tự, tôi sử dụng Danh sách, nếu không tôi sử dụng Đặt.


0

Đặt không cho phép bạn có các phần tử lặp lại trong đó. Nếu bạn cố gắng thêm một số phần tử mới, nó sẽ so sánh (sử dụng phương pháp Equals) từng phần tử đã có trong bộ sưu tập với phần tử bạn thêm vào và nếu một phần tử sửa lại đúng, phần tử sẽ không được thêm

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.