Ошибка: java.lang.ClassNotFoundException: org.hibernate.cfg.AnnotationConfiguration - PullRequest
0 голосов
/ 26 мая 2019

Я получаю сообщение об ошибке java.lang.ClassNotFoundException: org.hibernate.cfg.AnnotationConfiguration при запуске кода Spring из набора инструментов Spring

Я уже погуглил и проверил стекопоток на разрешение, но не повезло.

Это мой 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 ]

2 голосов
/ 27 мая 2019

Вы используете Spring Boot 2.1.3, который зависит от Spring 5.1. Линия Spring 5.x работает только с Hibernate 5.x, поддержка более ранних версий прекращена.

Зависимость spring-boot-starter-data-jpa уже включает в себя зависимость hibernate-entitymanager в версии, которая работает с другими зависимостями.

Другое дело, что вы смешиваете jar / модули из разных версий Spring, вы смешиваете 5.1.x и 3.0.6, что всегда является проблемой, поскольку они совершенно несовместимы. Кроме того, эта зависимость также включена в spring-boot-starter-data-jpa.

Итак, короче говоря, ваши зависимости немного беспорядочные.

<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>

ПРИМЕЧАНИЕ: Spring Boot также может управлять версией H2, поэтому с нее можно удалить тег version.

Вы используете XML, однако я настоятельно рекомендую отказаться от него и вместо этого использовать JPA. С текущим состоянием JPA больше нет необходимости использовать обычный Hibernate. И если вам действительно нужно, вы можете использовать EntityManager.unwrap(Session.class) для получения основного сеанса.

Дополнительным преимуществом является то, что теперь вы можете использовать автоконфигурацию для JPA из Spring Boot. Свойства в вашем 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

ПРИМЕЧАНИЕ: Вам не нужно указывать свойство driver-classname, поскольку Spring Boot и JDBC обнаружат его на основе заданного jdbc-url.

СОВЕТ: Убедитесь, что ваш аннотированный класс @SpringBootApplication находится в пакете com.test.market, как рекомендовано командой Spring Boot, поэтому он обнаружит все ваши классы, включая аннотированный @Entity классы.

Ваш код, возможно, вам придется изменить, чтобы использовать EntityManager вместо SessionFactory и Session, но это должно быть незначительное изменение.

1 голос
/ 27 мая 2019

Как сказал @crizzis, попробуйте удалить все другие зависимости и предоставить только следующее:

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

Данные Spring Starter уже включают все необходимые зависимости, такие как hibernate-core, hibernate-commons-annotations, javax.persistence-api, spring jdbc, h2 и т. д. Поэтому попробуйте удалить все другие зависимости, связанные с данными, из вашего pom и позвольте Springboot обрабатывать все такие зависимости через его стартер. Когда вы явно предоставляете версию и зависимость, она переопределит запущенную зависимость и может привести к несовместимостиПроблемы с версией, если вы не осторожны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...