我正在尝试让 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 impl 进行查询缓存,如果没有提示 org.hibernate.cacheable 直到当前版本 4.1,这是不可能的。当然,您可以将其存储在命名查询定义中的 xml 描述符中,并针对不同的 JPA 提供程序更改它(或存储所有变体的定义提示)。但在我们的项目中,我们实现了额外的实用程序,通过外部配置(props)为命名查询添加提示。例如:
ru.citc.jpa.queryhint.[query_name]=org.hibernate.cacheable\=true、javax.persistence.cache.retrieveMode\=USE 等...
实体缓存可以通过外部属性进行配置。请参阅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/