2013-02-25 49 views
7

Tôi có đoạn mã sau:Truy vấn Hibernate bộ nhớ cache

Person a = new Person(); 
a.setName("John"); 

Session session = openHibernateSession(); 

session.beginTransaction(); 

session.saveOrUpdate(a); 

Criteria critera = session.createCriteria(Person.class); 
critera.add(Restrictions.eq("name","John")); 
Person personFromCache = (Person) criteria.uniqueResult(); 

... 

session.commit(); 

Những gì tôi muốn là phải có khả năng đối tượng tìm kiếm từ cả hai cơ sở dữ liệu và bộ nhớ cache của Hibernate. Ví dụ sau trả về null khi gọi uniqueResult. Có cách nào để truy xuất các đối tượng đã lưu chưa được cam kết với cơ sở dữ liệu không?

Trả lời

1

Nếu bạn đang tìm kiếm ngoài ID thì Hibernate sẽ không sử dụng bộ nhớ cache cấp đầu tiên. Hibernate có được và tải có liên quan đến bộ nhớ cache cấp đầu tiên theo mặc định nhưng truy vấn tiêu chí là không. Trong trường hợp của bạn có hai giải pháp từ bên cạnh tôi

  1. By đỏ bừng phiên = Chỉ cần tuôn phiên của bạn như session.flush(); này trong khi làm như vậy dữ liệu từ phiên sẽ được đồng bộ hóa với cơ sở dữ liệu do đó Id ge sẽ được tạo ra và như Tiêu chuẩn kết quả truy vấn sẽ tìm kết quả trong cơ sở dữ liệu và sẽ dẫn đến danh sách kết quả cho bạn.

  2. Bật bộ nhớ cache cấp hai ngủ đông = Bạn có thể bật bộ nhớ cache cấp thứ hai bằng các nhà cung cấp bộ nhớ cache hibernate như ehCache và áp dụng mẹo.

0

Bạn có thể sử dụng StatelessSession nhưng được cảnh báo: những entitys không bị ràng buộc với bất kỳ phiên và bạn sẽ nhận được ngoại lệ nếu bạn thích để giải quyết các mối quan hệ hoặc các lĩnh vực lười biếng!

0
session.beginTransaction(); 

session.saveOrUpdate(a); 

session.flush(); 

Criteria critera = session.createCriteria(Person.class); 
critera.add(Restrictions.eq("name","John")); 
Person personFromCache = (Person) criteria.uniqueResult(); 
0

Chúng tôi thực hiện một số việc tương tự, ngoại trừ sử dụng khung kiểm tra TestNg. Một số câu trả lời thảo luận về cuộc gọi phương thức session.flush(). Chính xác. Cuộc gọi để tuôn ra cho Hibernate thực hiện một số việc, bao gồm đảm bảo rằng tất cả các cuộc gọi cơ sở dữ liệu hiện đang chờ trong hàng đợi được thực hiện và xóa khỏi hàng đợi.

0

Nó trả về dữ liệu ngay cả khi bạn đang chọn trên cơ sở tên người dùng. Nó không trả về null.

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