Hibernate JPA中处理存储库的标准方法

Hibernate JPA中处理存储库的标准方法,hibernate,jpa,Hibernate,Jpa,考虑以下场景 数据库中有一个表,其内容一起构成一个存储库。此表将很少更新(现有文本的更新、新实体的添加或实体的删除)。 因此,目前我使用的方法是创建一个singleton XXXRepository pojo,它将从XXX表中读取所有行(实体),并将它们存储在映射中 如果有人正在更新XXX表,那么在执行代码的更新部分后,将运行一个post runnable,它将清除存储库(map),因此下次从映射中找到任何实体时,将调用loadRepository(因为映射将为null) 这就是我目前处理存储库

考虑以下场景

数据库中有一个表,其内容一起构成一个存储库。此表将很少更新(现有文本的更新、新实体的添加或实体的删除)。 因此,目前我使用的方法是创建一个singleton XXXRepository pojo,它将从XXX表中读取所有行(实体),并将它们存储在映射中

如果有人正在更新XXX表,那么在执行代码的更新部分后,将运行一个post runnable,它将清除存储库(map),因此下次从映射中找到任何实体时,将调用loadRepository(因为映射将为null)

这就是我目前处理存储库缓存的方式,我可以在整个应用程序生命周期中使用它

JPA/Hibernate中是否提供/支持任何标准方法来实现/实现此要求

我经历了缓存机制(一级和二级缓存)。但它似乎是针对实体、查询或数据的,目的/方法与存储库预期发生或实现的不同。 此外,如果我们能够通过使用二级缓存以某种方式实现这一点,那么还有一个问题,即缓存仅在jpa操作和jpql查询的情况下更新。在jdbc或本机查询的情况下,它将无法更新,我们将有陈旧的数据(如果我错了,请纠正我)


请在这方面帮助我,jpa在这方面应该遵循的标准方式是什么

如果所有实体都可以毫无问题地保存在内存中,那么问题就可以通过二级缓存轻松解决。每次您想要从这些实体中读取数据时,只需执行获取所有实体的请求,并用Java过滤结果

如果这个唯一的“fetch all”请求缓存在二级缓存中,那么它将始终从内存返回实体,除非执行了更新(在这种情况下,二级缓存将丢弃其缓存的值)。您还应该将实体本身放在二级缓存中,并确保该实体的缓存能够容纳所有实体。这样,session.get调用和到此实体的关系导航也将使用二级缓存

总之,您已经重新实现了二级缓存为您所做的事情

无论解决方案是什么,如果某个进程在Hibernate背后更新数据,就不可能避免返回过时的数据。要么接受这一事实(并调整缓存的生存时间以限制过时),要么不接受这一事实,并且除了在每次需要数据时查询数据库之外别无选择