我的配置如下
persitence.xml
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.SingletonEhCacheProvider"/>
<property name="hibernate.ejb.classcache.demo.entities.UserID" value="read-only"/>
<property name="javax.persistence.sharedCache.mode" value="ALL"/>
ehcache.xml中
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">
<diskStore path="java.io.tmpdir/Customer-portlet-cache"/>
<defaultCache eternal="false" maxElementsInMemory="1000"
overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>
<cache name="userCache" eternal="true"
maxElementsInMemory="999" overflowToDisk="true"
diskPersistent="true" timeToIdleSeconds="0"
timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU"/>
</ehcache>
我有一个带注释的Seam Component @Create,它获取所有UserID的列表并将它们存储到缓存中。这里的想法是使用热缓存来获取应用程序,但是当我从应用程序访问实体时,我开始全面获取Lazy初始化异常(因为该实体与persistenceContext没有关联并且具有一些OneToMany和ManyToMany关系,并且它们不会加载实体,如果我将fetchtype设置为渴望,我会进入更讨厌的区域)
当用户访问应用程序时,是否存在获取热缓存的方法或解决方法。
答案 0 :(得分:1)
不要手动访问二级缓存。如果您需要一个单独的缓存层,请创建一个与hibernate不同的新缓存层。
在任何情况下,您可以Hibernate.initialize(..)
实体和馆藏,然后再将其发送到任何地方
最后,我认为您的二级缓存配置不正确。对于较新的版本,它应该如下所示:
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.region.factory_class"
value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory" />