在我的项目中,我必须拦截Hibernate L2缓存调用,以便为某些选定的缓存对象设置生命周期。问题是hibenate缓存调用永远不会通过拦截器。
我的拦截器(测试代码)
public class HibernateCacheInterceptor extends BaseCustomInterceptor {
private static Log log = LogFactory.getLog(HibernateCacheInterceptor.class);
@Override
public Object visitPutKeyValueCommand(InvocationContext ctx, PutKeyValueCommand command) throws Throwable {
log.info(this.getClass().getName() + " intercept.");
if (command.getValue() instanceof Car) {
return null;
} else {
return invokeNextInterceptor(ctx, command);
}
}
}
我的缓存定义(infinispan.xml)
<namedCache name="mycache">
<customInterceptors>
<interceptor position="FIRST" class="test.HibernateCacheInterceptor">
</interceptor>
</customInterceptors>
</namedCache>
org.infinispan.Cache.put(key,value)
调用来到拦截器但是hibernate缓存调用没有到来。 hibernate是否使用不同的API来跳过拦截器?我如何拦截hibernate缓存调用?
答案 0 :(得分:1)
不,Hibernate不能跳过拦截器 - 核心Infinispan的所有逻辑都是从拦截器触发的。
我的猜测是Hibernate不使用缓存(当你打开JConsole时,你能看到Infinispan中的条目吗?),使用另一个缓存(没有拦截器)或者在插入缓存之前缓冲条目。
您可以尝试在休眠和infinispan上设置跟踪日志记录。
答案 1 :(得分:1)
有更简单的方法来实现这一目标。如Infinispan 2LC documentation中所示(请参阅高级配置部分),可以为每个实体分配一个特定的缓存,您可以在其中以声明方式调整设置。最简单的方法是检查应用程序中使用的Infinispan配置,复制用于实体的默认缓存,给它一个不同的名称并进行调整。然后,您需要定义类似的内容:
<property name="hibernate.cache.infinispan.com.acme.Person.cfg"
value="person-entity"/>
其中person-entity
是该特定实体的缓存名称。
注意:请记住,如果您在Wildfly或EAP上运行,则属性名称需要指示部署存档和持久性单元名称。高级配置部分对此进行了解释。