2011-11-13 30 views
11

Tôi đang thực hiện thông qua lock method của hibernate. Tôi đã không có được những gì chúng tôi đang cố gắng đạt được thông qua phương pháp này.mục đích của phương thức session.lock trong Hibernate

p1 = (Person)session. get(Person.class,1);// person name is scott here 
// here peson name got update to henry by anothet thread 
session. lock(person, LockMode.READ) line 3 
// still name is henry too 

tôi đã cố gắng trên đoạn mã nhưng nó đã không đọc người đó từ cơ sở dữ liệu tại dòng 3. Tài liệu nói rằng Điều này có thể được sử dụng để thực hiện một kiểm tra phiên bản.

Bạn không chắc chắn cách kiểm tra phiên bản và giúp nhà phát triển trong mọi tình huống?

Tương tự, không chắc chắn những gì session.lock(person, LockMode.None) sẽ đạt được. Tài liệu cho biết LockMode.NONE được sử dụng để chỉ cần liên kết lại một phiên bản tạm thời với một phiên.

Không chắc chắn ý nghĩa của việc tái hợp một phiên bản tạm thời với phiên. Một kịch bản ngắn gọn sẽ là một trợ giúp lớn?

Trả lời

11

Các chế độ khóa khác nhau có nghĩa là để ngăn không cho thực thể bị sửa đổi và đọc từ nhiều nguồn cùng một lúc, xem mục nhập tài liệu về pessimistic locking để biết chi tiết. Theo kinh nghiệm của tôi, những điều này hiếm khi cần thiết, vì mức độ cô lập cơ sở dữ liệu thường phải quan tâm đến việc khóa khi cần:

Nó không dành nhiều thời gian đáng lo ngại về việc khóa các chiến lược . Nó thường là đủ để xác định một mức cô lập cho các kết nối JDBC và sau đó chỉ cần để cho cơ sở dữ liệu làm tất cả công việc. Tuy nhiên, người dùng nâng cao có thể muốn nhận được khóa bi quan độc quyền hoặc lấy lại khóa khi bắt đầu giao dịch mới.

Đối với các "reassociating một trường hợp thoáng qua với phiên" (Tôi thực sự nghĩ rằng họ có nghĩa là ví dụ tách ra?), Hãy xem xét các hình ảnh sau đây (Hibernate entity lifecycle):

Hibernate entity lifecycle

Đây là mô tả từ Hibernate community documentation:

Hibernate định nghĩa và hỗ trợ các đối tượng sau đây nêu rõ:

  • Tạm thời - một đối tượng tạm thời nếu nó vừa được khởi tạo bằng toán tử mới và không được liên kết với phiên Hibernate . Nó không có biểu diễn liên tục trong cơ sở dữ liệu và không có giá trị số nhận dạng nào được gán. Các phiên bản tạm thời sẽ là bị bộ thu gom rác hủy nếu ứng dụng không giữ tham chiếu nữa. Sử dụng phiên Hibernate để tạo một đối tượng liên tục (và để Hibernate xử lý các câu lệnh SQL cần phải được thực thi cho quá trình chuyển đổi này).
  • Persistent - một trường hợp liên tục có biểu diễn trong cơ sở dữ liệu và giá trị số nhận dạng. Nó có thể đã được lưu hoặc tải, tuy nhiên, nó theo định nghĩa trong phạm vi của một phiên. Hibernate sẽ phát hiện bất kỳ thay đổi nào được thực hiện cho một đối tượng ở trạng thái liên tục và đồng bộ hóa trạng thái với cơ sở dữ liệu khi đơn vị công việc hoàn tất.Nhà phát triển không thực hiện báo cáo CẬP NHẬT thủ công hoặc câu lệnh DELETE khi đối tượng cần được thực hiện tạm thời.
  • Tách rời - một cá thể tách rời là một đối tượng mà đã liên tục, nhưng Phiên của nó đã bị đóng. Các tham chiếu đến đối tượng vẫn còn hợp lệ, tất nhiên, và trường hợp tách rời có thể thậm chí được sửa đổi trong trạng thái này. Một cá thể tách rời có thể được gắn lại vào một Phiên mới vào một thời điểm sau đó, làm cho nó (và tất cả các sửa đổi ) liên tục trở lại. Tính năng này cho phép lập trình mô hình cho các đơn vị hoạt động lâu dài yêu cầu thời gian suy nghĩ của người dùng. Chúng tôi gọi cho họ các giao dịch ứng dụng, nghĩa là một đơn vị công việc từ góc nhìn của người dùng.
Các vấn đề liên quan