2011-08-08 30 views
6

tôi đã gặp một kịch bản:Cơ sở dữ liệu kích hoạt và Hibernate

  1. save hoặc update một số dữ liệu trong một bảng mục tiêu bằng cách ngủ đông
  2. có một kích hoạt trên bảng mục tiêu đó sẽ được thực hiện trước khi insert hoặc update hoạt động của các bảng mục tiêu
  3. select ra kỷ lục này bằng cách ngủ đông

Nhưng tôi thấy rằng các lĩnh vực đã được sửa đổi bởi kích hoạt không thực sự lấy ra. Điều này có liên quan đến các giao dịch cam kết của Hibernate (flush() đã được gọi) hoặc bộ đệm ẩn Hibernate không? cảm ơn.

Trả lời

4

Điều này có thể do cả bộ nhớ cache thứ nhất (phiên) hoặc thứ hai (ví dụ: ehcache). Để đọc lại thực thể, bạn cần gọi session.refresh().

Từ hibernate docs (ở dưới cùng của phần này)

Có thể nạp lại một đối tượng và tất cả các bộ sưu tập của mình bất cứ lúc nào , sử dụng phương pháp làm mới(). Điều này rất hữu ích khi cơ sở dữ liệu gây nên được sử dụng để khởi tạo một số thuộc tính của đối tượng.

sess.save(cat); 
sess.flush(); //force the SQL INSERT 
sess.refresh(cat); //re-read the state (after the trigger executes) 
9

Bạn có thể lập bản đồ tài sản như generated values. Những giá trị này luôn đến từ cơ sở dữ liệu và không thể được lưu trữ. Hibernate tự động tải các giá trị này trong một truy vấn tiếp theo sau khi chèn hoặc cập nhật cơ sở dữ liệu.

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