【问题标题】:Standard way to handle Repository in JPA在 JPA 中处理存储库的标准方法
【发布时间】:2011-02-23 13:06:20
【问题描述】:

考虑以下场景。

在 db 中有一个表,它的内容一起形成一个存储库。此表将很少更新(更新现有扩展、添加新实体或删除实体)。 所以目前我使用的方法是创建一个单例 XXXRepository pojo,它将读取 XXX 表中的所有行(实体)并将它们存储在地图中。

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

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

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

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

请在这方面帮助我,在 jpa 中为此遵循的标准方法是什么。

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

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

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

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

    无论解决方案是什么,如果某个进程在 Hibernate 背后更新数据,则无法避免返回陈旧数据。要么您接受这个事实(并调整缓存的生存时间以限制陈旧性),要么您不接受它并且您别无选择,只能在每次需要数据时查询数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 2017-09-01
      • 1970-01-01
      • 2017-01-06
      • 2018-05-03
      • 2021-09-20
      • 2018-09-25
      • 2016-11-12
      相关资源
      最近更新 更多