[英]How do I migrate my JPA DAO to Spring Data with second level cache?
我有一堆JPA DAO正在尋求遷移到Spring Data JPA。 我的一些DAOS設置了二級/查詢緩存。
我有一個進程,我只在查詢中檢索ID,然后使用findByID()
查找實體。 這樣,只有id在不同的查詢緩存中相乘,並且整個實體都在二級緩存中。
例:
@NamedQuery(name = "SystemUser.findByEmail",
query = "SELECT u.id FROM SystemUser u WHERE email=:email"),
…
public SystemUser findByEmail(String email) {
TypedQuery<Long> q = getEntityManager().createNamedQuery("SystemUser.findByEmail", Long.class);
q.setParameter("email", email);
q.setHint("org.hibernate.cacheable", true);
q.setHint("org.hibernate.cacheRegion", "query.systemUser");
List<Long> res = q.getResultList();
if (res != null && res.size() > 0) {
return findById(res.get(0));
}
return null;
}
我有幾個findBy…
-methods,都是這樣做的。 感覺這是保持緩存內存消耗的好方法。
我對Spring Data JPA業務有點新意,但我看不出我會如何實現這一點? @Cacheable
注釋似乎只處理查詢緩存,這對我來說會復制每個查詢緩存中的實體?
有沒有辦法用Spring Data做到這一點? 指針將非常感激。
在Spring Data JPA中,只需創建一個findByEmail
方法,Spring Data JPA將找到您的命名查詢或自己創建一個查詢。
public class SystemUserRepository extends CrudRepository<SystemUser, Long> {
SystemUser findByEmail(String email);
}
應該只需要執行查詢和所需的結果。 現在使用@QueryHints
您可以添加您現在正在設置的提示。
public class SystemUserRepository extends CrudRepository<SystemUser, Long> {
@QueryHints(
@QueryHint(name="org.hibernate.cacheable", value="true"),
@QueryHint(name="org.hibernate.cacheRegion", value="query.systemUser") )
SystemUser findByEmail(String email);
}
結果將被緩存,用戶仍將來自二級緩存(如果可用,否則創建)。 假設您的實體當然是@Cacheable
。
可以在這里找到關於2個不同緩存如何工作(一起)的精彩讀物。 關於查詢緩存如何工作的小片段。
查詢緩存在概念上看起來像一個哈希映射,其中密鑰由查詢文本和參數值組成, 值是與查詢匹配的實體Id的列表 :
如果您想要更復雜的邏輯(並且真正實現您所做的優化),您始終可以實現自己的存儲庫 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.