GaryF là không sai, nhưng không phải là về mặt kỹ thuật đúng :-) Anton là chính xác hơn về vấn đề này, nhưng để bổ sung cho câu trả lời của mình:
Đầu Cấp Cache: đây là một "bộ nhớ cache" mà các cửa hàng tất cả các đối tượng được biết đến theo một phiên cụ thể. Vì vậy, nếu bạn có 3 giao dịch trong phiên này, nó sẽ giữ tất cả các thực thể được chạm vào bởi cả ba giao dịch. Nó sẽ bị xóa khi bạn đóng phiên hoặc khi bạn thực hiện phương thức "rõ ràng".
Bộ nhớ cache cấp hai: đây là bộ nhớ cache "thực" và được ủy quyền cho nhà cung cấp bên ngoài, chẳng hạn như Infinispan. Trong bộ nhớ cache này, bạn có toàn quyền kiểm soát nội dung của bộ nhớ cache, nghĩa là bạn có thể chỉ định những mục nào cần được loại bỏ, những mục nào sẽ được giữ lại lâu hơn và cứ thế tiếp tục.
Đối với bộ nhớ cache cấp đầu tiên, điều gì sẽ xảy ra khi bộ nhớ cache đầy? Bạn đã đề cập đến hai trường hợp mà bộ nhớ cache bị xóa nhưng tôi chắc chắn nó sẽ tự động bị xóa theo thuật toán "được sử dụng lần cuối" hoặc tương tự khi bộ nhớ cache được lấp đầy. Nếu không, một ngoại lệ bộ nhớ sẽ xảy ra, hoặc không có gì có thể lưu trữ trong bộ nhớ cache sau thời điểm đó. – KyleM
Bạn có thể muốn kiểm tra điều này bằng tài liệu hoặc bằng cách thử nghiệm chính mình, nhưng theo như tôi nhớ, các mục nhập trên bộ nhớ cache cấp đầu tiên sẽ không bao giờ bị xóa. Vì vậy, nếu bạn có một giao dịch ảnh hưởng đến một lượng lớn dữ liệu, bạn có thể thực sự phải đối mặt với một ngoại lệ Out of Memory (như trong các hoạt động hàng loạt). Đối với trường hợp "cạnh" này, bạn có thể muốn sử dụng StatelessSession (http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/StatelessSession.html). – jpkrohling