简体   繁体   English

将Spring 4.1.X迁移到4.2.x,方法LocalSessionFactoryBean.setCacheRegionFactory(RegionFactory cacheRegionFactory)的第二级缓存问题

[英]Spring migration 4.1.X to 4.2.x 2nd level caching issue for method LocalSessionFactoryBean.setCacheRegionFactory(RegionFactory cacheRegionFactory)

I`m upgrading project from Spring-4.1.6.RELEASE to Spring-4.2.1.RELEASE and Hibernate (core and Ehcache) from 4.3.9.Final to 5.0.1.Final. 我将项目从Spring-4.1.6.RELEASE升级到Spring-4.2.1.RELEASE和Hibernate(核心和Ehcache)从4.3.9.Final升级到5.0.1.Final。

In Spring-4.1.6.RELEASE, there is a method 在Spring-4.1.6.RELEASE中,有一种方法

org.springframework.orm.hibernate4.LocalSessionFactoryBean.setCacheRegionFactory(RegionFactory cacheRegionFactory)

But in Spring 4.2.1.RELEASE, there is no such method in class 但是在Spring 4.2.1.RELEASE中,类中没有这样的方法

org.springframework.orm.hibernate5.LocalSessionFactoryBean

So when I set property in hibernate session factory bean to enable second level caching using 因此,当我在休眠会话工厂bean中设置属性以启用使用

<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>

Following error is thrown: 引发以下错误:

WARN : org.springframework.beans.factory.support.DefaultListableBeanFactory - Bean creation exception on FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in class path resource [application-context.xml]: Cannot resolve reference to bean 'transactionManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [application-context.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [application-context.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'cacheRegionFactory' of bean class [org.springframework.orm.hibernate5.LocalSessionFactoryBean]: Bean property 'cacheRegionFactory' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
WARN : org.springframework.web.context.support.XmlWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.envers.spring.dao.UserDAO com.envers.spring.HomeController.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.envers.spring.dao.UserDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in class path resource [application-context.xml]: Cannot resolve reference to bean 'transactionManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [application-context.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [application-context.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'cacheRegionFactory' of bean class [org.springframework.orm.hibernate5.LocalSessionFactoryBean]: Bean property 'cacheRegionFactory' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:834)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:633)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:681)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:552)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031)

How to configure second level caching in Spring-4.2.1.RELEASE and Hibernate-5.0.1.FINAL? 如何在Spring 4.2.1.RELEASE和Hibernate-5.0.1.FINAL中配置二级缓存? What will be the code substitution in Hibernate-5 to enable second level caching? Hibernate-5中的代码替换将启用二级缓存吗?

Please help on this migration issue. 请帮助解决此迁移问题。 Thanks in advanced. 提前致谢。

tl;dr version: Change HibernateTransactionManager class's package from org.springframework.orm.hibernate4 to org.springframework.orm.hibernate5. tl; dr版本:将 HibernateTransactionManager类的包从org.springframework.orm.hibernate4更改为org.springframework.orm.hibernate5。

I was able to get this working by changing from this: 通过更改以下内容,我可以使它工作:

<!-- Set up default hibernate properties. -->
<bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
        </props>
    </property>
</bean>

<bean id="cacheRegionFactory" class="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory">
    <constructor-arg index="0" ref="hibernateProperties" />
</bean>

<bean id="sessionFactory" class="org.nrg.framework.orm.hibernate.AggregatedAnnotationSessionFactoryBean"
      p:cacheRegionFactory-ref="cacheRegionFactory" p:dataSource-ref="dataSource"
      p:hibernateProperties-ref="hibernateProperties" p:namingStrategy-ref="namingStrategy" />

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory" />

To this: 对此:

<!-- Set up default hibernate properties. -->
<bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
        </props>
    </property>
</bean>

<bean id="sessionFactory" class="org.nrg.framework.orm.hibernate.AggregatedAnnotationSessionFactoryBean"
      p:dataSource-ref="dataSource" p:hibernateProperties-ref="hibernateProperties" p:physicalNamingStrategy-ref="namingStrategy" />

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory" />

The big changes here are: 这里的主要变化是:

<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>

You've already done this part. 您已经完成了这一部分。

The other changes are: 其他更改是:

  • Changing p:namingStrategy-ref to p:physicalNamingStrategy-ref (this required a change in my custom naming implementation, but pretty easy) 将p:namingStrategy-ref更改为p:physicalNamingStrategy-ref(这需要更改我的自定义命名实现,但非常简单)
  • Removing the SingletonEhCacheRegionFactory bean declaration 删除SingletonEhCacheRegionFactory bean声明
  • Removing the p:cacheRegionFactory-ref property setting 删除p:cacheRegionFactory-ref属性设置
  • Changing the HibernateTransactionManager class's package from org.springframework.orm.hibernate4 to org.springframework.orm.hibernate5 将HibernateTransactionManager类的包从org.springframework.orm.hibernate4更改为org.springframework.orm.hibernate5

I think the last one is probably the critical thing you need to change. 我认为最后一个可能是您需要更改的关键内容。

Overall, I'd prefer to have the type-safe ability to set the cache region manager through a bean rather than the free-form property value setting, but this will patch us over until I can figure out another way to do it. 总的来说,我更喜欢具有类型安全性的功能来通过bean而不是自由格式的属性值设置来设置缓存区域管理器,但这将修补我们,直到我想出另一种方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 什么可以使Android 4.1.X中的加载速度慢而不是4.2? - What could make the loading slow in android 4.1.X and not on 4.2? spring-ws 2.2.2与spring 4.2.x兼容吗? - Is spring-ws 2.2.2 compatible with spring 4.2.x? Json不接受Spring MVC 4.1.x RestFul服务抛出 - Spring MVC 4.1.x RestFul Service throwing Not Acceptable for Json 在JBoss 4.2.x上升级到Quartz 1.6 - Upgrade to Quartz 1.6 on JBoss 4.2.x Netty 4.1.x直接内存监视 - Netty 4.1.x direct memory monitoring 将项目A(Spring 4.2.x)添加为项目B(Spring Boot 2,Spring 5)的依赖项 - Add Project A (Spring 4.2.x) as dependency of Project B (Spring Boot 2, Spring 5) HttpClient 4.1.x的文档在哪里? - Where is the documentation for HttpClient 4.1.x? 从Spring 4.0.x迁移到4.1.x以来的肮脏测试上下文 - Dirty test context since migrating from spring 4.0.x to 4.1.x Spring Batch 3.0.2与Spring Core 4.1.x的集成 - 使用@EnableBatchProcessing的适当方法是什么? - Spring Batch 3.0.2 integration with Spring Core 4.1.x - What is the appropriate way to use @EnableBatchProcessing? 不能在Spring-Integration 4.1.x中将String值转换为ExpressionEvaluatingRequestHandlerAdvice的Expression - Cannot convert String value to Expression for ExpressionEvaluatingRequestHandlerAdvice in spring-integration 4.1.x
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM