2009-12-18 26 views
6

Tôi đã cố gắng giải thích cách tốt nhất để xử lý xem thực tiễn tốt là thực hiện hashcode và bằng các thực thể (tôi có nghĩa là thực thể theo nghĩa chung) nhưng trong hầu hết các trường hợp, nó sẽ là một thực thể JPA).Để bằng và hashcode hoặc không phải trên các lớp thực thể, đó là câu hỏi

Trong Chương 24 của Hibernate thủ http://docs.jboss.org/hibernate/core/3.3/reference/en/html/best-practices.html nó nói này ...

Xác định các phím tự nhiên cho tất cả các đơn vị , và bản đồ chúng bằng cách sử . Thực hiện equals() và hashCode() để so sánh các thuộc tính tạo nên khóa tự nhiên.

Có ý nghĩa khi có .equals và .hashcode chỉ bao gồm các khóa tự nhiên này nhưng nếu bạn có nhiều cá thể cùng một thực thể (cùng một id tự nhiên, cùng mã băm)? Có vẻ như thực hành này có thể có những tác động tinh tế ở nơi khác trong ứng dụng của bạn. Có ai đã thử điều này trước đây trên quy mô lớn không?

Trả lời

3

Có những lúc bạn muốn Bằng để so sánh tất cả thuộc tính và thời gian khi bạn muốn Bằng với chỉ là khóa. Chúng tôi đã có nhiều thành công hơn khi sử dụng các lớp trợ giúp rõ ràng nên không có sự mơ hồ về những gì được so sánh.

ByKeyComparer.Equals... 
ByPropertiesComparer.Equals... 

hoặc

Entity1.EqualsByKey... 
Entity1.EqualsByProperties... 
+1

cảm giác gì nó làm được bằng bằng phím nhưng không bằng bởi các thuộc tính? Nó giống như được bình đẳng bởi tham chiếu nhưng không bằng giá trị. –

+3

thực thể mới sẽ không có khóa chính (nếu bạn đang sử dụng thay thế là cách tiêu chuẩn). Vì vậy, bằng sẽ không làm việc cho các thực thể mới nếu bạn đang sử dụng chìa khóa để so sánh. –

+0

phương pháp nào bạn sử dụng cho các lớp liên tục 'equals()' và 'hashcode()' phương pháp sau đó? Một sự lựa chọn cần phải được thực hiện cho chúng vì chúng sẽ được gọi bởi Collection hoặc Hibernate code. –

6

Tôi đã thử điều này trước đây trên quy mô lớn (hoặc ít nhất là trong một ứng dụng sử dụng nhiều công nghệ ngủ đông). Đó là một ý tưởng hay.

Có ý nghĩa khi có .equals và .hashcode chỉ bao gồm các khóa tự nhiên này nhưng nếu bạn có nhiều cá thể cùng một thực thể (cùng một id tự nhiên, cùng mã băm)? Có vẻ như thực hành này có thể có những tác động tinh tế ở nơi khác trong ứng dụng của bạn.

Đây là ý nghĩa của nó. Thông thường, bạn cần muốn nhiều phiên bản của cùng một thực thể thành công khi so sánh .equals và yes, nó có tác động ở nơi khác. IMO những ngụ ý đó là mọi thứ sẽ hoạt động như mong đợi.

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