【问题标题】:java.lang.NoClassDefFoundError: org/hibernate/engine/SessionFactoryImplementor from Spring 3.1.2/Hibernate 4.1.7 and Shards 3.0.0.Beta2java.lang.NoClassDefFoundError:来自 Spring 3.1.2/Hibernate 4.1.7 和 Shards 3.0.0.Beta2 的 org/hibernate/engine/SessionFactoryImplementor
【发布时间】:2012-10-15 21:05:27
【问题描述】:

我正在使用 Hibernate Core 4.1.7 和 Spring 3.1.2 尝试一个简单的 Hibernate 分片示例(是的,奇怪,4 年前发布的 3.0.0.Beta2),并在会话工厂初始化期间遇到了这个问题:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in class path resource [shardedspring-config.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.hibernate.SessionFactory it.sella.lab.crm.sys.persistence.ShardedSessionFactoryBuilder.createSessionFactory()] threw exception; nested exception is java.lang.NoClassDefFoundError: org/hibernate/engine/SessionFactoryImplementor
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:581)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1015)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at in.rixx.crm.model.Activity.<clinit>(Activity.java:17)

这就是我选择 Spring 和 Hibernate 的方式:

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.1.7.Final</version>
 </dependency>
 <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>3.1.2.RELEASE</version>
 </dependency> 

这似乎不是分片库的问题 - 它似乎是由重构的 SessionFactoryImplementor 类引起的一般问题。参考https://jira.springsource.org/browse/SPR-8885,我还为 bean 'transactionmanager' 切换到 org.springframework.orm.hibernate4.HibernateTransactionManager - 它没有帮助。

Spring 3.x 和 Hibernate 4.x 目前是否有任何功能性解决方法?

【问题讨论】:

标签: spring hibernate exception maven sharding


【解决方案1】:

我也遇到了同样的问题,我搜索了一些其他网站并得到了帮助 我来解决这个问题。我做错的是我使用的休眠版本 4 在 Maven 中用于事务管理器,但在 Maven 中我正在配置 版本 3 的休眠事务管理器,即 不兼容。我像这样更改了spring配置文件。

<bean id="hibernateTransactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
    <!-- <bean id="hibernateTransactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean> -->

【讨论】:

    【解决方案2】:

    我看到您正在使用带有 spring 的 HIbernate 4。所以似乎是 spring & hibernate 的相互兼容性问题。因此,请访问以下站点以了解 Hibernate 4 与 Spring 的兼容性。

    http://blog.springsource.org/2012/04/06/migrating-to-spring-3-1-and-hibernate-4-1/

    作为另一种选择,请尝试以下版本。

    <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.3.1.GA</version>
        </dependency>
    

    【讨论】:

      【解决方案3】:

      Hibernate 核心不需要任何注释依赖,因此请确保您的 pom 没有任何 hibernate-annotation 或 hibernate-common-annotation 依赖。

      我的工作pom如下。

      <properties>
          <spring.version>4.0.5.RELEASE</spring.version>
          <junit.version>4.11</junit.version>
          <jdk.version>1.6</jdk.version>
      </properties>
      
      <dependencies>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>3.8.1</version>
              <scope>test</scope>
          </dependency>
      
          <!-- Spring dependencies -->
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-core</artifactId>
              <version>${spring.version}</version>
          </dependency>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context</artifactId>
              <version>${spring.version}</version>
          </dependency>
      
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-web</artifactId>
              <version>${spring.version}</version>
          </dependency>
      
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-webmvc</artifactId>
              <version>${spring.version}</version>
          </dependency>
      
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-orm</artifactId>
              <version>${spring.version}</version>
          </dependency>
      
          <!-- Servlet -->
          <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>servlet-api</artifactId>
              <version>3.0-alpha-1</version>
          </dependency>
      
          <!-- JSTL -->
          <dependency>
              <groupId>jstl</groupId>
              <artifactId>jstl</artifactId>
              <version>1.2</version>
          </dependency>
      
      
          <!-- Apache Commons Upload -->
          <dependency>
              <groupId>commons-fileupload</groupId>
              <artifactId>commons-fileupload</artifactId>
              <version>1.2.2</version>
          </dependency>
      
          <!-- Apache Commons Upload -->
          <dependency>
              <groupId>commons-io</groupId>
              <artifactId>commons-io</artifactId>
              <version>1.3.2</version>
          </dependency>
      
          <!-- MYSQL dependency -->
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>5.1.6</version>
          </dependency>
      
          <!-- Hibernate -->
          <dependency>
              <groupId>org.hibernate</groupId>
              <artifactId>hibernate-core</artifactId>
              <version>4.3.5.Final</version>
          </dependency>
      
          <!-- If using JPA (2), add: -->
      
      
          <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-api</artifactId>
              <version>1.5.6</version>
          </dependency>
      
          <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-log4j12</artifactId>
              <version>1.5.6</version>
          </dependency>
      
          <dependency>
              <groupId>c3p0</groupId>
              <artifactId>c3p0</artifactId>
              <version>0.9.1.2</version>
          </dependency>
      
          <dependency>
              <groupId>org.javassist</groupId>
              <artifactId>javassist</artifactId>
              <version>3.18.1-GA</version>
          </dependency>
      
      </dependencies>
      

      【讨论】:

        【解决方案4】:

        通过删除 hibernate-common-annotations 我得到了不同的错误 java.lang.ClassNotFoundException: org.hibernate.engine.SessionFactoryImplementor

        这是会话工厂和事务管理器之间的版本差异

        这里是解决方案的链接 [http://devjav.com/spring-java-lang-classnotfoundexception-org-hibernate-engine-sessionfactoryimplementor/][1]

        来自上面链接的解决方案: 为事务管理器和本地会话工厂 bean 使用正确版本的 Hibernate

        org.springframework.orm.hibernate3.HibernateTransactionManager
        org.springframework.orm.hibernate3.LocalSessionFactoryBean
        
         <beans:bean id="sessionFactory" name="sessionFactory"
                class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
                <beans:property name="configLocation">
                   <beans:value>classpath:hibernate.cfg.xml</beans:value>
                </beans:property>
                <beans:property name="hibernateProperties">
                    <beans:props>
                        <beans:prop key="hibernate.show_sql">true</beans:prop>
                    </beans:props>
                </beans:property>
            </beans:bean>
        <beans:bean id="transactionManager"
                class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <beans:property name="sessionFactory" ref="sessionFactory" />
            </beans:bean>
        

        【讨论】:

        • 请在答案中附上解决方案,因为该链接可能并不总是可用。
        猜你喜欢
        • 2016-08-12
        • 1970-01-01
        • 2014-06-20
        • 2013-02-11
        • 2013-10-18
        • 2012-04-08
        • 2015-10-28
        • 2016-03-05
        • 2015-06-05
        相关资源
        最近更新 更多