jpa hibernate和二级缓存

时间:2011-04-29 06:52:45

标签: hibernate caching jpa persistence

我的配置如下

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设置为渴望,我会进入更讨厌的区域)

当用户访问应用程序时,是否存在获取热缓存的方法或解决方法。

1 个答案:

答案 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" />