2015-11-26 100 views
14

我想升級到Hibernate 5,但由於某種奇怪的原因,我無法使其工作。如何使用Spring 4配置Hibernate 5

與Hibernate 4我的Spring上下文的配置是這樣的:

.... 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="annotatedClasses" ref="hibernateClasses" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect"> 
       ${hibernate.dialect} 
      </prop> 
      <prop key="hibernate.show_sql"> 
       ${hibernate.show_sql} 
      </prop> 
      <prop key="hibernate.format_sql">true</prop> 
      <prop key="hibernate.generate_statistics"> 
       ${hibernate.generate_statistics} 
      </prop> 
      <prop key="hibernate.hbm2ddl.auto"> 
       ${hibernate.hbm2ddl.auto} 
      </prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

.... 

我離開了數據源和hibernateClasses Bean的定義。

對於休眠5,我改變了包名hibernate5這樣的:

.... 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="annotatedClasses" ref="hibernateClasses" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect"> 
       ${hibernate.dialect} 
      </prop> 
      <prop key="hibernate.show_sql"> 
       ${hibernate.show_sql} 
      </prop> 
      <prop key="hibernate.format_sql">true</prop> 
      <prop key="hibernate.generate_statistics"> 
       ${hibernate.generate_statistics} 
      </prop> 
      <prop key="hibernate.hbm2ddl.auto"> 
       ${hibernate.hbm2ddl.auto} 
      </prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

.... 

當我運行我的測試應用程序上下文無法啓動,因爲它無法找到的LocalSessionFactoryBean類:-S。這個類位於彈簧ORM JAR,實際上是存在的,但由於某種原因,它不能被發現,並拋出以下異常:

java.lang.NoClassDefFoundError: Could not initialize class org.springframework.orm.hibernate5.LocalSessionFactoryBuilder 

我的Maven的依賴關係如下:

<!-- Servlet API --> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>${servlet-api.version}</version> 
     <scope>provided</scope> 
    </dependency> 

    <!-- Spring libraries --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</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-core</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jdbc</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aspects</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <!-- Hibernate --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>${hibernate.version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>cglib</groupId> 
       <artifactId>cglib</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>asm</groupId> 
       <artifactId>asm</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-simple</artifactId> 
     <version>${slf4j.version}</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
     <scope>provided</scope> 
    </dependency> 

    <!-- Test --> 
    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib</artifactId> 
     <version>${cglib.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>asm</groupId> 
     <artifactId>asm</artifactId> 
     <version>${asm.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>${junit.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>${spring.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-mock</artifactId> 
     <version>${spring-mock.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.easymock</groupId> 
     <artifactId>easymock</artifactId> 
     <version>${easymock.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hsqldb</groupId> 
     <artifactId>hsqldb</artifactId> 
     <version>${hsqldb.version}</version> 
     <scope>test</scope> 
    </dependency> 

有誰知道一個想法我做錯了什麼?

+0

什麼是你的pom文件中的hibernate-version? –

+0

我使用的版本是5.0.4.Final – Tranquilized

+1

你的春天版本是什麼?我有與彈簧4.2.6和休眠5.5.3配置相同的問題。 –

回答

9

可能是你應該添加

<dependency> 
    <groupId>javax.transaction</groupId> 
    <artifactId>jta</artifactId> 
    <version>1.1</version> 
</dependency> 

我有同樣的問題,我最初的日誌抱怨,

java.lang.NoClassDefFoundError: javax/transaction/SystemException

+0

Thnx!這個伎倆 – Tranquilized

6

@sapna答案工作。

但是,對於那些好奇,爲什麼它休眠5.0.3.Final和5.0.4.Final之間打破了,這裏就是答案:他們取消了對JTA的依賴,這是:

<dependency> 
    <groupId>org.apache.geronimo.specs</groupId> 
    <artifactId>geronimo-jta_1.1_spec</artifactId> 
    <version>1.1.1</version> 
    <scope>compile</scope> 
</dependency> 

的變化在那裏描述:HHH-10178

因此,如果您要從5.0.x升級到5.0.4或5.0.5,並且希望不更改任何類到您的類路徑,則應該導入此庫而不是javax.transaction:jta one 。

編輯: 他們恢復了這個變化與休眠5.0.7:HHH-10307,所以升級到這個版本或更新應該也解決了這個問題。

相關問題