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

标签 hibernate spring caching jpa-2.0 ehcache

我正在尝试让 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 应用程序上下文中启用一些额外的注释处理程序吗?

谢谢。

最佳答案

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

    ru.citc.jpa.queryhint.[query_name]=org.hibernate.cacheable\=true、javax.persistence.cache.retrieveMode\=USE 等...

  2. 实体缓存可以通过外部属性进行配置。请参阅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 - 在 J2SE 中使用 JPA 2.0 @Cacheable 与 Spring、EHCache 和 Hibernate,无需 Hibernate 特定注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686322/

相关文章:

java - 从属性文件中读取 map 并使用 spring 注释 @Value 加载

ASP.NET 回发和后退按钮

html - 更新一个 html 文件,以便浏览器知道不使用缓存中的文件

mysql - 在 Restful Web 服务中使用 Hibernate 的 SQL 查询

java - 找不到 hibernate.cfg.xml (该文件实际上不存在)。配置位于dispatcher-servlet中

hibernate - 在GORM中使用复合键

java - t.page 上的 Freemarker utf-8 编码问题

java - 从另一个 POST 执行 TEMPORARY_REDIRECT 时添加 POST 数据

java - Tomcat 8.5 识别新内容的时间过长

Hibernate:java.lang.Integer和int之间有什么区别?