Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring,多个Hibernate会话工厂配置_Java_Hibernate_Spring_Ehcache - Fatal编程技术网

Java Spring,多个Hibernate会话工厂配置

Java Spring,多个Hibernate会话工厂配置,java,hibernate,spring,ehcache,Java,Hibernate,Spring,Ehcache,我需要在我的应用程序中设置多个SessionFactory,现在我面临一个问题。我现在不能使用二级缓存,因为只返回第一个工厂的缓存。我想,提供一个hibernate.cache.region\u前缀将解决这个问题。如何为每个工厂提供每个SpringXML配置的自己的区域 applicationContext.xml <bean id="hibernateProperties" class="org.springframework.beans.factory.config.Prope

我需要在我的应用程序中设置多个SessionFactory,现在我面临一个问题。我现在不能使用二级缓存,因为只返回第一个工厂的缓存。我想,提供一个
hibernate.cache.region\u前缀将解决这个问题。如何为每个工厂提供每个SpringXML配置的自己的区域

applicationContext.xml

<bean id="hibernateProperties"
    class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
        <list>
            <value>/WEB-INF/hibernate/hibernate.properties</value>
        </list>
    </property>
</bean>

<bean id="cacheRegionFactory" class="org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge">
    <constructor-arg>
        <props>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
        </props>
    </constructor-arg>
</bean>

<bean id="factory_1"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="db2Datasource" />
    <property name="mappingDirectoryLocations" value="classpath:de/ac/hibernate" />
    <property name="hibernateProperties" ref="hibernateProperties" />
    <property name="cacheRegionFactory" ref="cacheRegionFactory" />
</bean>

<bean id="factory_2"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="db2Datasource2" />
    <property name="mappingDirectoryLocations" value="classpath:de/ac/hibernate" />
    <property name="hibernateProperties"  ref="hibernateProperties" />
    <property name="cacheRegionFactory" ref="cacheRegionFactory" />
</bean>
<bean id="factory_1"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="db2Datasource" />
    <property name="mappingDirectoryLocations" value="classpath:de/ac/hibernate" />
    <property name="hibernateProperties" ref="hibernateProperties" />
    <property name="cacheRegionFactory" ref="cacheRegionFactory" />
    <property name="cacheRegion" value="ip_10_5_14_5_" />
</bean>

我不想提供每个sessionfactory的属性,这可能吗?我正在使用Spring3.0.2,Hibernate3.5解决了我的问题。我通过变通办法解决了这个问题

LocalSessionFactoryBeanMod.class

public class LocalSessionFactoryBeanMod extends LocalSessionFactoryBean {

    private String cacheRegion;

    public String getCacheRegion() {
        return this.cacheRegion;
    }

    public void setCacheRegion(String cacheRegion) {
        this.cacheRegion = cacheRegion;
        getHibernateProperties().put("hibernate.cache.region_prefix", cacheRegion);
    }

    @Override
    public void setHibernateProperties(Properties hibernateProperties) {
        if (getHibernateProperties().isEmpty()) {
            super.setHibernateProperties(hibernateProperties);
        } else {
            getHibernateProperties().putAll(hibernateProperties);
        }
    }
}
applicationContext.xml

<bean id="hibernateProperties"
    class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
        <list>
            <value>/WEB-INF/hibernate/hibernate.properties</value>
        </list>
    </property>
</bean>

<bean id="cacheRegionFactory" class="org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge">
    <constructor-arg>
        <props>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
        </props>
    </constructor-arg>
</bean>

<bean id="factory_1"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="db2Datasource" />
    <property name="mappingDirectoryLocations" value="classpath:de/ac/hibernate" />
    <property name="hibernateProperties" ref="hibernateProperties" />
    <property name="cacheRegionFactory" ref="cacheRegionFactory" />
</bean>

<bean id="factory_2"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="db2Datasource2" />
    <property name="mappingDirectoryLocations" value="classpath:de/ac/hibernate" />
    <property name="hibernateProperties"  ref="hibernateProperties" />
    <property name="cacheRegionFactory" ref="cacheRegionFactory" />
</bean>
<bean id="factory_1"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="db2Datasource" />
    <property name="mappingDirectoryLocations" value="classpath:de/ac/hibernate" />
    <property name="hibernateProperties" ref="hibernateProperties" />
    <property name="cacheRegionFactory" ref="cacheRegionFactory" />
    <property name="cacheRegion" value="ip_10_5_14_5_" />
</bean>


当然,这不是一个真正干净或通用的解决方案,但现在适合我的需要。可能其他人可以提供更平滑的解决方案。

您是否尝试使用
net.sf.ehcache.hibernate.SingletonEhCacheProvider
作为缓存提供程序,因为它的唯一目的是支持多个会话工厂并使用单例缓存