2011-11-15 26 views
40

Tôi ước gì tôi biết chính xác từng mục trong danh sách này, cách thức hoạt động, hậu quả và thời điểm sử dụng chính xác.Hibernate: Refresh, Evict, Replicate and Flush

  1. Refresh
  2. đuổi
  3. Replicate
  4. Flush

Tôi thậm chí còn tự hỏi những gì mỗi người thực hiện, nhưng tôi không hoàn toàn chắc chắn, vì vậy tôi yêu cầu giúp đỡ của bạn, vì tôi thực sự muốn hiểu nó.

Tôi biết đó là một câu hỏi khá chung chung, nhưng tôi nghĩ thực sự hữu ích khi biết về tất cả.

Cảm ơn.

Trả lời

41

Hibernate Documentation cho ví dụ điển hình về điều này. Ngoài ra, blog post này sẽ cung cấp cho bạn một số thông tin chi tiết. Tôi sẽ thêm một số dòng từ đó bên dưới.

Có thể tải lại đối tượng và tất cả các bộ sưu tập của đối tượng bất kỳ lúc nào bằng cách sử dụng phương thức refresh(). Điều này rất hữu ích khi kích hoạt cơ sở dữ liệu đượ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) 

xem here để biết thêm ví dụ.

Bất cứ khi nào bạn chuyển đối tượng đến save(), update() or saveOrUpdate() và bất cứ khi nào bạn truy xuất đối tượng bằng cách sử dụng load(), get(), list(), iterate() or scroll(), đối tượng đó sẽ được thêm vào bộ nhớ cache nội bộ của Phiên.

Khi sau đó flush() được gọi, trạng thái của đối tượng đó sẽ được đồng bộ hóa với cơ sở dữ liệu. Nếu bạn không muốn đồng bộ hóa này xảy ra, hoặc nếu bạn đang xử lý một số lượng lớn các đối tượng và cần quản lý hiệu quả bộ nhớ, phương pháp evict() có thể được sử dụng để xóa đối tượng và các bộ sưu tập của nó khỏi bộ nhớ cache cấp một.

ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set 
while (cats.next()) { 
    Cat cat = (Cat) cats.get(0); 
    doSomethingWithACat(cat); 
    sess.evict(cat);  // (if gives the compile time error then use it: sess.evict(cat.getClass()); 
} 

Đọc ví dụ hoàn chỉnh từ here.

Đọc về phiên API here.

+0

Tôi đang cố gắng gọi sessionFectory.evict (mèo) nhưng nó cho tôi lỗi biên dịch thời gian - đối số không áp dụng được. –

+1

@KevalTrivedi Xem xét việc đăng câu hỏi mới với tất cả thông tin liên quan như mã mẫu và nhật ký mẫu của bạn. – ManuPK

10

replicate() được dự định sẽ được sử dụng thay vì save()/persist() khi bạn cần lưu một thực thể có số nhận dạng nhất định mặc dù thực tế là số nhận dạng của thực thể được định cấu hình sẽ được tạo. Điều này hữu ích khi một số thực thể (có thể đến từ các hệ thống bên ngoài) có các định danh đã tồn tại từ trước, trong khi các thực thể khác cùng loại cần các mã định danh của chúng được tạo ra.

Tuy nhiên, do một lỗi tồn tại từ lâu trong Hibernate (HHH-1459, HHH-2716) replicate() không hoạt động như mong đợi với một số loại máy phát điện id. Vấn đề này giới hạn tính hữu dụng của replicate() và yêu cầu bạn triển khai các giải pháp khó chịu để mô phỏng hành vi của nó nếu chiến lược trình tạo id của bạn bị ảnh hưởng và bạn không thể thay đổi nó.

3
  • session.flush() Làm tan chảy lực lượng phiên Hibernate để đồng bộ hóa trạng thái trong bộ nhớ của phiên với cơ sở dữ liệu.
  • session.evict() Tách đối tượng khỏi bộ nhớ cache phiên. Sau khi tách đối tượng ra khỏi phiên, mọi thay đổi đối tượng sẽ không được duy trì.
  • session.refresh() Tải lại tất cả dữ liệu.
  • session.replicate() Dữ liệu được sao chép ở Datastore khác nhau ở các chế độ khác nhau.