2012-05-24 98 views
1

我試圖設置infinispan作爲第二級緩存,用於基於spring + tomcat的應用程序中的hibernate。spring + hibernate + infinispan作爲第二級緩存

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${hibernate.connection.driver_class}"/> 
    <property name="url" value="${hibernate.connection.url}"/> 
    <property name="username" value="${hibernate.connection.username}"/> 
    <property name="password" value="${hibernate.connection.password}"/> 
    <property name="maxActive" value="${hibernate.connection.maxActive}"/> 
    <property name="maxIdle" value="${hibernate.connection.maxIdle}"/> 
    <property name="minIdle" value="${hibernate.connection.minIdle}"/> 
    <property name="maxWait" value="${hibernate.connection.maxWait}"/> 
</bean> 

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager"> 
     <bean class="com.arjuna.ats.jta.TransactionManager" factory-method="transactionManager"/> 
    </property> 
    <property name="userTransaction"> 
     <bean class="com.arjuna.ats.jta.UserTransaction" factory-method="userTransaction"/> 
    </property> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan" value="com.example"/> 

    <!----> 
    <property name="hibernateProperties" ref="db-properties"/> 
</bean> 

而且屬性是:

hibernate.cache.use_second_level_cache=true 
hibernate.cache.use_query_cache=true 
hibernate.cache.region.factory_class=org.hibernate.cache.infinispan.InfinispanRegionFactory 

我得到一個異常:

Caused by: org.infinispan.CacheException: This is transactional cache but no transaction manager could be found. Configure the transaction manager lookup properly. 

如何配置一個事務管理器查找?

回答

0

Hibernate和Infinispan都需要了解TransactionManager。如果你告訴Hibernate有關TransactionManager的信息,它會反過來告訴你Infinispan。我猜Spring有一種方法可以告訴Hibernate有關JTA的設置,但是我找不到它。 Hibernate的部分(我看你至少試圖使用Hibernate 4)需要被告知哪個org.hibernate.service.jta.platform.spi.JtaPlatform使用。 org.hibernate.service.jta.platform.spi.JtaPlatform是Hibernate知道如何與JTA環境交互的合約。

0

最簡單的答案春天是添加(內id="sessionFactory" Spring XML配置):

<property name="jtaTransactionManager" ref="transactionManager"/> 

這是在春季3.2.2.RELEASE可用(也可能是在舊的春季版本太多,我猜想自Spring 3.1.x起)

這應該達到Steve Ebersole指出的。這導致Spring通過類提供JtaPlatform https://github.com/SpringSource/spring-framework/blob/master/spring-orm-hibernate4/src/main/java/org/springframework/orm/hibernate4/ConfigurableJtaPlatform.java

有關JTA用法,請參閱JavaDoc for org.springframework.orm.hibernate4.LocalSessionFactoryBean(您正在使用)。

相關問題