Spring, несколько конфигураций Hibernate Sessionfactories - PullRequest
3 голосов
/ 20 августа 2010

Мне нужно настроить несколько Sessionfactories в моем приложении, теперь я столкнулся с проблемой.Сейчас я не могу использовать кэш 2-го уровня, потому что возвращается только кэш первой фабрики.Полагаю hibernate.cache.region_prefix, я думаю, это решит проблему.Как я могу предоставить для каждой фабрики свой регион для конфигурации Spring XML?

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>

hibernate.properties

hibernate.dialect=org.hibernate.dialect.DB2400Dialect
hibernate.connection.autocommit=false
hibernate.connection.charset=UTF-8
hibernate.show_sql=false
hibernate.cache.use_second_level_cache=false
hibernate.generate_statistics=false

Я не хочу указывать свойства для каждого сеанса. Это вообще возможно?Я пользуюсь Spring 3.0.2, Hibernate 3.5

Ответы [ 2 ]

1 голос
/ 20 августа 2010

ОК hibernate.cache.region_prefix исправляет мою проблему.Я решил проблему обходным путем.

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="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>

Конечно, это не совсем чистое или общее решение, носоответствует моим потребностям на данный момент.Возможно, кто-то другой может предложить более плавное решение.

0 голосов
/ 14 мая 2015

Вы пытались использовать net.sf.ehcache.hibernate.SingletonEhCacheProvider в качестве поставщика кэша, поскольку его единственная цель - поддерживать несколько фабрик сессий и использовать одноэтапный кэш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...