Làm rõ thuật ngữ - “hydrating” một thực thể JPA hoặc Hibernate có nghĩa là gì khi tìm nạp thực thể từ DB


76

Trong ngữ cảnh ORM / Lazy tải các thực thể, hiểu biết của tôi về thuật ngữ "Hydrat hóa" như sau:

"Hydrating" mô tả quá trình điền một số hoặc tất cả các thuộc tính chưa được phổ biến trước đây của một thực thể được tìm nạp bằng cách tải chậm.

Ví dụ: lớp Authorđược tải từ cơ sở dữ liệu:

@Entity
class Author
{
     @Id
     long id;
     List<Book> books;
}

Ban đầu, booksbộ sưu tập không được phổ biến.

Tôi hiểu rằng quá trình tải booksbộ sưu tập từ cơ sở dữ liệu được gọi là "Hydrating" bộ sưu tập.

Định nghĩa này có đúng không và thuật ngữ này có phải là nơi phổ biến không? Có thuật ngữ nào khác phổ biến hơn mà tôi nên sử dụng cho quá trình này không?


3
Đối với người đã bỏ phiếu để đóng câu hỏi: Tôi đã thêm một ví dụ để giúp làm rõ những gì tôi đang hỏi. Vui lòng bình luận nếu nó vẫn chưa rõ ràng và cho tôi biết những gì tôi có thể làm rõ.
Marty Pitt

Câu trả lời:


131

Hydrate bắt đầu như một thuật ngữ để chỉ một đối tượng / mô hình giá trị được khởi tạo (nhưng trống) từ một db, (cụ thể là trong Hibernate.)

Nhiều ORM và công cụ khác như BizTalk sử dụng Hydrate và các thuật ngữ liên quan khác, (ví dụ: BizTalk sử dụng thuật ngữ Dehydrated để có nghĩa là một phiên bản có sẵn nhưng chưa được phổ biến.)

Cá nhân tôi không thích việc sửa đổi thuật ngữ thừa, phổ biến có nghĩa là tương tự, mà không cần phát minh lại ngôn ngữ. Nó không bổ sung gì và dẫn đến nhầm lẫn (suy nghĩ đầu tiên thường gặp khi gặp các thuật ngữ được phát minh lại: điều này bằng cách nào đó khác biệt và kỳ diệu? ).

Phần mở rộng BizTalk của phong cách ngôn ngữ này, cụ thể là Dehydrated là thừa. Tôi mong rằng mọi người chưa quên cách nói, trống rỗng hay rõ ràng ?

Hydrated và các phép ẩn dụ liên quan về cơ bản là các công cụ tiếp thị, được phát minh để phân biệt Hibernate với các sản phẩm cạnh tranh.

Tại thời điểm này, Hibernate và các sản phẩm ORM khác đã sử dụng các thuật ngữ này trong nhiều năm, vì vậy Hydrate (và Dehydrate) vẫn ở đây.


18
Tất nhiên, nó là lần đầu tiên, nó đơn giản và như vậy nó ít phức tạp hơn nhiều. Lúc này bạn có thể cũng đã nhận ra rằng hầu hết mọi thứ trên lớp phần mềm, thậm chí một giá trị bit là "true / false" hoặc "1/0" đều là ẩn dụ ... Bây giờ chúng ta có nên bắt đầu gọi 'true' một cái gì đó khác không? Làm thế nào về 'gần như chắc chắn' đối với Heisenberg?
ocodo

16
Tôi nghĩ "hydrat" là một phép ẩn dụ tốt hơn nhiều so với "dân cư". Dân cư gợi nhớ đến một nhóm người thuộc địa di chuyển đến một lãnh thổ xa lạ hoặc còn trinh nguyên và "cư trú" ở đó. Có một khoảng trống và bạn lấp đầy nó bằng một thứ gì đó không liên quan (nhưng có lẽ là thuộc về đó). Ở đâu khi ngậm nước một thứ gì đó, nói một quả vả khô, tinh chất của chất đó nhưng lại thiếu sự sung mãn. Đó chính xác là những gì xảy ra khi bạn "ngậm nước" một vật thể. Khác xa với "marketing fluff", hydrate là một phép ẩn dụ tuyệt vời.
Kyle Mathews

4
@KyleMathews Chà, đã ba năm trôi qua kể từ khi tôi đăng câu trả lời của mình, tôi không nói rõ ràng rằng "Dân cư" là thuật ngữ đã có từ trước cho cùng một hoạt động, tại thời điểm này, "Hydrated" vẫn là một thuật ngữ ngoài lề và là chỉ được sử dụng trong một số nền văn hóa ngôn ngữ / sản phẩm nhất định, trong khi "Dân cư" vẫn là thuật ngữ chung và được sử dụng rộng rãi hơn. Bằng mọi cách, hãy tiếp tục và sử dụng "Hydrate" nếu nó làm bạn hài lòng, cá nhân tôi thấy nó tự phụ và bị ảnh hưởng.
ocodo

19
Nếu bạn sử dụng "hydrate" xung quanh những người không hiểu từ đó, bạn sẽ phải giải thích nó. Tại sao không chỉ sử dụng một từ mà khán giả của bạn đã có thể hiểu được, ngay cả khi đó không phải là từ chính xác nhất có thể?
Samantha Branham

6
Thực tế là không ai biết hydrate có nghĩa là gì nếu không tra cứu nó cho thấy rằng đó là một từ buzz ngu ngốc mà không may hiện nay nó đang được sử dụng trong nhiều khuôn khổ ORM.
BadHorsie

11

Vì đây là một câu hỏi rất phổ biến, câu trả lời này dựa trên một bài báo tôi đã viết trên blog của mình.

Trạng thái đã tải thực thể

Khi bạn đang tìm nạp một thực thể, Hibernate sẽ cố gắng tải nó từ bộ đệm ẩn cấp hai hoặc cơ sở dữ liệu.

Trạng thái đã tải thực thể

Nếu thực thể không được lưu trữ trong bộ đệm ẩn cấp thứ hai, thì một truy vấn sẽ được thực thi và JDBC ResultSetđược chuyển đổi thành một thực Object[]thể có chứa các giá trị thuộc tính thực thể thời gian tải.

Bộ nhớ cache cấp thứ hai lưu trữ điều này Object[]khi lưu vào bộ nhớ đệm một thực thể. Vì vậy, khi tải một thực thể từ DB hoặc bộ đệm ẩn cấp hai, bạn sẽ nhận được Object[]mảng giá trị thuộc tính thực thể.

Quá trình chuyển đổi Object[]trạng thái được tải thành một đối tượng thực thể Java được gọi là quá trình hydrat hóa và nó trông như sau:

final Object[] values = persister.hydrate(
    rs, id, object,
    rootPersister, cols, eagerPropertyFetch, session
);

Trạng thái đã tải được lưu trong Ngữ cảnh bền bỉ hiện đang chạy dưới dạng đối tượng EntityEntry và nó sẽ được sử dụng sau này cho cơ chế kiểm tra bẩn mặc định , so sánh dữ liệu thực thể hiện tại với ảnh chụp nhanh thời gian tải.

Trạng thái được tải cũng được sử dụng làm giá trị mục nhập bộ đệm cho bộ đệm thực thể cấp thứ hai.

Các hoạt động nghịch đảo của biến đổi thực thể để một Object[]được sử dụng khi ràng buộc giá trị tham số SQL cho INSERT, UPDATEhoặc DELETEbáo cáo được gọi là mất nước .


4

hydrat hóa là một thuật ngữ lỏng lẻo. Trong công ty của chúng tôi, chúng tôi sử dụng "bù nước" theo cách gọi của ông để tải tất cả các thuộc tính đối tượng của toàn bộ đồ thị đối tượng. Đây là một bài đăng nói về các mức độ hydrat hóa khác nhau (một lần nữa đây là cách sử dụng chung mặc dù chúng đang sử dụng trong ngữ cảnh ngủ đông).


2

Tôi nghĩ rằng thuật ngữ 'hydrate (các)' 'trong ngữ cảnh của ORM chỉ đơn giản có nghĩa là khung cung cấp cho bạn các đối tượng. Vì vậy, các đối tượng được ORM 'ngậm nước' sau khi dữ liệu được lấy từ cửa hàng. Thuật ngữ này có thể được áp dụng bất cứ lúc nào khung ORM cung cấp cho bạn một đối tượng / đồ thị được biểu diễn trong cửa hàng.


0

thuật ngữ hydrat hóa được sử dụng rộng rãi trong ruột của thư viện hibernate để chỉ quá trình thiết lập các trường của một đối tượng được tải gần đây và thực sự có liên quan đến phổ biến biểu đồ đối tượng.
nhưng nó khác với khái niệm tải lười biếng, tức là cung cấp cho người dùng một đối tượng được lấp đầy một nửa và để phần còn lại được tải theo yêu cầu.
quá trình hydrat hóa luôn được thực hiện, một cách lười biếng hoặc háo hức và đó là công cụ ngủ đông.
tải lười chỉ là để thuận tiện

thay thế hibernate bằng tên của orm bạn chọn


0

Hydrat hóa là một thuật ngữ miền ORM chung có nghĩa là một phương pháp mà kết quả truy vấn được trả về. Nó không phải là một quá trình, không phải là một động từ, không phải là một hành động hay sự kiện xảy ra mà là một danh từ. Do đó, hydrat hóa chỉ có thể có nghĩa là sử dụng phương pháp hydrat hóa, tức là sử dụng phương pháp cụ thể đó , không có gì khác và không mang lại gì tự thân do đó không bao giờ được sử dụng . Một hydrat hóa cụ thể có thể khởi tạo một đối tượng và điền vào nó trước khi trả về tham chiếu của nó nhưng hydrat hóa nói chung không có nghĩa là tạo ra. Các hydrat hóa khác nhau trả lại các cấu trúc khác nhau:

  • vô hướng số ít
  • mảng vô hướng
  • mảng của mảng
  • mảng đồ vật
  • đối tượng thu thập vô hướng
  • mảng thu thập đối tượng
  • đối tượng thu thập các đối tượng khác
  • ...hơn

Đó là chi tiết triển khai ORM. Một số ORM cung cấp nhiều hydrat hóa và bạn có thể chọn một bằng cách chuyển một đối số đến trình tạo truy vấn, một số không cung cấp cho bạn quyền kiểm soát đó và thay thế nó bằng cách cố gắng thông minh về nó, điều này thường dẫn đến các giả định sai.

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.