gpt4 book ai didi

hibernate - 在具有 Spring、EHCache 和 Hibernate 的 J2SE 中使用 JPA 2.0 @Cacheable,无需特定于 Hibernate 的注释

转载 作者:行者123 更新时间:2023-12-04 06:20:10 25 4
gpt4 key购买 nike

我试图让 JPA 2.0 缓存在我使用 Hibernate 和 EhCache 的 Spring 3.0.5 应用程序中工作。我不希望我的应用程序绑定(bind)到 Hibernate 和 EhCache,并希望它尽可能地使用纯 JPA 代码。

通过设置 Hibernate 特定的 @Cache,我设法让缓存与 EHCache 和 Hibernate 一起工作。在我的实体类顶部注释并指定 org.hibernate.cacheable作为我的命名查询的查询提示。

但是,当我尝试将它们切换到 @Cacheable(true)并设置查询提示 javax.persistence.cache.retrieveMode"CacheRetrieveMode.USE" (我也试过 "USE" )它不起作用,我应该缓存的命名查询刚刚从数据库中再次检索到。我使用 hints = ... 在 NamedQuery 本身的注释中指定这些。

我尝试了 <shared-cache-mode> 的各种组合, ENABLE_SELECTIVE , DISABLE_SELECTIVE等等,但似乎没有任何效果。

我开始怀疑这个功能在 J2SE 上不可用。我错过了什么吗?我应该从 Spring 应用程序上下文中启用一些额外的注释处理程序吗?

谢谢。

最佳答案

  • 使用 Hibernate JPA 进行查询缓存意味着没有提示是不可能的 org.hibernate.cacheable 直到当前版本 4.1。当然,您可以将它存储在命名查询定义中的 xml 描述符中,并为不同的 JPA 提供程序更改它(或为所有变体存储定义提示)。但是在我们的项目中,我们实现了额外的实用程序,通过外部配置(props)向命名查询添加提示。例如:

    ru.citc.jpa.queryhint.[query_name]=org.hibernate.cacheable\=true, javax.persistence.cache.retrieveMode\=USE,etc...
  • 实体缓存可以由外部属性配置。见 there .例子:
        <prop key="hibernate.ejb.classcache.ru.citc.migcredit.csrfront.model.Form">read-write,ScriptExecution</prop>
    <prop key="hibernate.ejb.collectioncache.ru.citc.migcredit.csrfront.model.Form.fields">read-write,ScriptExecution</prop>
    <prop key="hibernate.ejb.collectioncache.ru.citc.migcredit.csrfront.model.Form.constraints">read-only,ScriptDesignCollections</prop>

  • 因此,我们拥有带有外部配置的纯 JPA 代码,用于缓存和其他提供者特定的功能。这非常适合 Hibernate 和 EclipseLink。作为额外的奖励,我们对不同的应用程序模块有不同的缓存策略(例如,管理 Web 应用程序不缓存元数据表,但运算符(operator) Web 应用程序将其缓存为只读)。

    关于hibernate - 在具有 Spring、EHCache 和 Hibernate 的 J2SE 中使用 JPA 2.0 @Cacheable,无需特定于 Hibernate 的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686322/

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