gpt4 book ai didi

spring - 如何将 JPA DAO 迁移到具有二级缓存的 Spring Data?

转载 作者:行者123 更新时间:2023-12-02 09:31:00 24 4
gpt4 key购买 nike

我有一堆 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...-方法,都是这样做的。这感觉是降低缓存内存消耗的好方法。

我对 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

关于这两种不同的缓存如何(一起)工作的好书可以在 here 找到。 。关于查询缓存如何工作的小片段。

The query cache looks conceptually like an hash map where the key is composed by the query text and the parameter values, and the value is a list of entity Id's that match the query:

如果您想要更复杂的逻辑(并真正实现您所做的优化),您可以随时实现 own repository .

关于spring - 如何将 JPA DAO 迁移到具有二级缓存的 Spring Data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30153355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com