2010-08-25 28 views
12

Tôi đang sử dụng Hibernate 3.5.1 và EntityManager để lưu giữ dữ liệu (với JPA 2.0 và EHCache 1.5). Tôi có thể có được các truy vấn bằng đoạn mã sau:Trình quản lý đối tượng công khai HIbernate: Cách truy vấn bộ nhớ cache?

EntityManager em; 
... 
Query query = em.createQuery(...); 
... 

Bây giờ, vấn đề là createQuery EntityManager của() phương thức trả về javax.persistence.Query đó, không giống như org.hibernate.Query (được trả về bởi createQuery của SessionFactory() method), không có phương thức org.hibernate.Query.setCacheable().

Tôi làm cách nào để lưu trữ truy vấn bằng EntityManager (hoặc một số phần khác của Hibernate)?

Trả lời

24

Bạn có thể sử dụng phương thức unwrap để thực hiện triển khai nhà cung cấp khi bạn muốn sử dụng tiện ích mở rộng của nhà cung cấp cụ thể. ví dụ:

org.hibernate.Query hquery = query.unwrap(org.hibernate.Query.class); 

Sau đó, bạn có thể làm việc với giao diện nhà cung cấp cụ thể. Hoặc bạn chỉ có thể tháo EntityManager thành Session trước khi tạo truy vấn.

Nếu bạn không muốn có bất kỳ nhập khẩu Hibernate trong mã của bạn, bạn cũng có thể làm

query.setHint("org.hibernate.cacheable", Boolean.TRUE); 

Thật tùy thuộc vào bạn mà cách bạn thà giới thiệu sự phụ thuộc nhà cung cấp.

Tôi sẽ ưu tiên đầu tiên vì nó sẽ thất bại với ngoại lệ nếu hibernate bị xóa khỏi phụ thuộc của bạn gửi lên một màu đỏ lớn "Hey bạn phát triển thay đổi điều này, đã có một sự phụ thuộc của nhà cung cấp ở đây." Trong khi gợi ý chỉ đơn giản là không làm gì nếu nó không được hiểu bởi các nhà cung cấp.

Những người khác thà chịu đựng việc có chuỗi ma thuật phụ thuộc vào nhà cung cấp trong mã cần phải có sự phụ thuộc của nhà cung cấp biên dịch.

+1

Cảm ơn các gợi ý. Tôi sẽ sử dụng "chuỗi ma thuật cụ thể của nhà cung cấp" với chuỗi được nhập từ lớp chủ sở hữu liên tục (như HibernateHintConstants), sẽ đảm bảo rằng lỗi biên dịch được tạo nếu tôi xóa Hibernate (miễn là tôi nhớ xóa lớp đó) để gợi ý Hibernate cụ thể). – eold

+4

@leden - Các chuỗi đã có trong org.hibernate.ejb.QueryHints, để tránh phát minh lại bánh xe. – OrangeDog

+0

Bạn cũng có thể thêm gợi ý trong chú thích @NamedQuery – OrangeDog

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