0

我想有一点我还没有理解。我有一个班级女巫在属性中有 3 个元素集合

public class Pays implements Serializable{
private static final long serialVersionUID = -8767337896773261244L;
/**
 * the id of the country
 */
private long id;

/**
 * name of the country
 */
private String nom;
/**
 * The region of the country
 */
private Region region;
/**
 * Relations between a country and a composant
 */
private Set<PaysComposants> pc = new HashSet<PaysComposants>(0);
/**
 * Relations between a country and a service
 */
private Set<PaysServices> ps = new HashSet<PaysServices>(0);
/**
 * Relations between a country and some keys figures
 */
private Set<KeyFigure> kf = new HashSet<KeyFigure>(0);

我是 DAO,我有一个从服务层调用的函数

 @Override
public Pays read(String nomPays) {
    Criteria criteria = super.getSession().createCriteria(Pays.class);
    criteria.setFetchMode("pc", FetchMode.JOIN);
    criteria.setFetchMode("ps", FetchMode.JOIN);
    criteria.setFetchMode("kf", FetchMode.JOIN);
    criteria.add(Restrictions.eq("nom", nomPays));
    criteria.setCacheable(true);
    Pays p=(Pays) criteria.uniqueResult();  
    return p;   }

实际上,唯一放入缓存的对象只有 Pays p,其他集合 pc、ps 和 kf 没有放入缓存。

这是我的 ehCache.xml

  <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
monitoring="autodetect" dynamicConfig="true">

<defaultCache maxElementsInMemory="100000" eternal="false"
    timeToIdleSeconds="3600" timeToLiveSeconds="3600" overflowToDisk="true" />

<cache name="org.hibernate.cache.internal.StandardQueryCache"
    maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="3600"
    timeToLiveSeconds="3600">
</cache>

<cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
    maxElementsInMemory="10000" eternal="true">
</cache>

我的休眠属性

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="current_session_context_class">thread</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.use_structured_entries">true</prop>
            <prop key="hibernate.cache.generate_statistics">true</prop>
            <prop key="hibernate.cache.provider_class">
                org.hibernate.cache.EhCacheProvider
            </prop>
            <prop key="hibernate.cache.region.factory_class">
                org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
            </prop>
            <prop key="hibernate.cache.provider_configuration_file_resource_path">
                applicationContext-ehCache-entity.xml
            </prop>

        </props>
    </property>

和我的 Maven 依赖

 <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-ehcache</artifactId>
        <version>4.2.0.Final</version>
    </dependency>

我怎样才能做到这一点?我使用 FetchMde.Join 是因为我想避免 n+1 选择,实际上我的 Pays 是在一个选择中加载的。预先感谢。

4

2 回答 2

0

Hibernate 将只缓存 Pays p 对象,这是真的,因为 Criteria 仅在该对象上创建。如果要缓存其他集合,则必须在集合属性的 getter 方法上使用 Cachebale。您也可以在每个 Entity 对象上使用 Cache 注释。

于 2013-04-16T13:46:53.763 回答
0

我解决了我的问题,只需在我的 web.xml 中应用一个过滤器,如下所示:

<filter>
    <filter-name>openSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>baselineSessionFactory</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>openSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
于 2013-04-19T11:25:02.877 回答