从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>
答案 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
而不是EntityManager
和SessionFactory
,但这应该是一个很小的更改。
答案 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通过启动器处理所有此类依赖项。当您明确提供版本和依赖项时,它将覆盖启动的依赖项,如果不小心,可能会导致版本不兼容的问题。