错误:java.lang.ClassNotFoundException:org.hibernate.cfg.AnnotationConfiguration

时间:2019-05-26 06:28:38

标签: spring hibernate maven spring-boot jpa

从spring工具套件运行spring代码时,我收到错误java.lang.ClassNotFoundException:org.hibernate.cfg.AnnotationConfiguration

我已经用Google搜索并检查了stackoverflow的分辨率,但是没有运气。

这是我的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.thoughtworkstest</groupId>
<artifactId>supermarket</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>supermarket</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.3.156</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.6.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>3.0.6.RELEASE</version>
    </dependency>

    <!-- Dependencies for SQLite -->
    <dependency>
        <groupId>org.xerial</groupId>
        <artifactId>sqlite-jdbc</artifactId>
        <version>3.25.2</version>
    </dependency>
    <dependency>
        <groupId>net.kemitix</groupId>
        <artifactId>sqlite-dialect</artifactId>
        <version>0.1.0</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

这是app-context.xml

 
<context:property-placeholder 
  location="classpath:META-INF/spring/hibernate.properties"/>

 <bean id="dataSource" 
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="${jdbc.driverClassName}" />
  <property name="url" value="${jdbc.url}" />
  <property name="username" value="${jdbc.username}" />
  <property name="password" value="${jdbc.password}" />
 </bean>
 <bean id="sessionFactory" 
  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="annotatedClasses" value="com.test.market.model.ItemDetails" />
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
    <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
   </props>
  </property>
 </bean>


</beans>

2 个答案:

答案 0 :(得分:2)

您正在使用依赖于Spring 5.1的Spring Boot 2.1.3。 Spring 5.x系列仅适用于Hibernate 5.x,已经放弃了对早期版本的支持。

在与其他依赖项一起使用的版本中,DECLARE @TempTable TABLE(ReferenceCode VARCHAR(150),[Value] VARCHAR(50),BalanceSheetExchangeRate VARCHAR(50),Type1 VARCHAR(50),Type2 VARCHAR(50),IsDivByzero VARCHAR(50)); ;WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/Quipu.CRMExtensions.BusinessLogicLayer.Financials.Models.Financials') INSERT INTO @TempTable(ReferenceCode,[Value],BalanceSheetExchangeRate,Type1,Type2,IsDivByzero) SELECT _xml.col.value('(ReferenceCode)[1]','varchar(150)') as [ReferenceCode], _xml.col.value('(Value)[1]','varchar(50)') as [Value], _xml.col.value('(AttributeName)[1]','varchar(50)') as [BalanceSheetExchangeRate], _xml.col.value('(Type1)[1]','varchar(50)') as [Type1] , _xml.col.value('(Type2)[1]','varchar(50)') as [Type2], _xml.col.value('(IsDivByZero)[1]','varchar(50)') as [IsDivByZero] FROM @xml.nodes('//FinancialDecimalKeyValue') as _xml(col); SELECT * FROM @TempTable; 依赖项已经包含spring-boot-starter-data-jpa依赖项。

另一个问题是,您正在混合来自不同版本的Spring的jar /模块,而您正在混合5.1.x和3.0.6,这总是很麻烦,因为它们非常不兼容。此外,该依赖项也包含在hibernate-entitymanager中。

因此,简而言之,您的依赖关系有些混乱。

spring-boot-starter-data-jpa

注意::Spring Boot也可以管理H2版本,因此您可以从中删除<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> <!-- Dependencies for SQLite --> <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.25.2</version> </dependency> <dependency> <groupId>net.kemitix</groupId> <artifactId>sqlite-dialect</artifactId> <version>0.1.0</version> </dependency> </dependencies> 标签。

您正在使用XML,但是我强烈建议您放弃它,而改用JPA。使用JPA的当前状态,实际上不再需要使用普通的Hibernate。如果确实需要,则可以使用version获取基础会话。

附加的优点是您现在可以从Spring Boot对JPA使用自动配置。 EntityManager.unwrap(Session.class)中的属性应放在正确名称下的hibernate.properties中。

application.properties

注意::您无需指定spring.datasource.url= # your jdbc.url value spring.datasource.username = # your jdbc.username value spring.datasource.password = # your jdbc.password value spring.jpa.database-platform = # your hibernate.dialect value spring.jpa.show-sql = # your hibernate.show_sql value 属性,因为Spring Boot和JDBC将根据给定的driver-classname检测到该属性。

提示:请确保您的jdbc-url带注释的类位于@SpringBootApplication包中,如Spring Boot团队所建议的那样,以便它将检测您的所有类,包括您的com.test.market带注释的类。

您的代码,您可能需要更改为使用@Entity而不是EntityManagerSessionFactory,但这应该是一个很小的更改。

答案 1 :(得分:1)

像@crizzis一样,请尝试删除所有其他依赖项,并仅提供以下内容:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Spring Starter数据jpa已经包含所有必需的依赖项,例如hibernate-core,hibernate-commons-annotations,javax.persistence-api,spring jdbc,h2等。因此,请尝试从pom中删除所有其他与数据相关的依赖项,并让springboot通过启动器处理所有此类依赖项。当您明确提供版本和依赖项时,它将覆盖启动的依赖项,如果不小心,可能会导致版本不兼容的问题。