2011-02-23 39 views
0

请考虑以下情形。在JPA中处理存储库的标准方法

db中有一个表格,其内容一起形成一个存储库。这个表格将会更新(更新现有的extities,增加新的实体或删除实体)。 因此,目前我使用的方法是创建一个单独的XXXRepository pojo,它将从XXX表读取所有行(实体)并将它们存储在地图中。

如果有人更新XXX表,那么执行代码的更新部分后,会运行一个可运行的后台,它将清除存储库(映射),因此下次从映射定位任何实体时,loadRepository将会被调用(因为地图将是空的)。

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

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

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

请在这方面帮助我,因为这是jpa中遵循的标准方式。

回答

1

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

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

很明显,您已经重新实现了二级缓存为您所做的工作。

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

相关问题