Класс SpringHibernateJpaPersistenceProvider не реализует запрошенный интерфейс PersistenceProvider

Я в тупике - я не использовал Hibernate несколько лет, а затем никогда с Spring Boot. Spring Boot, но не с Hibernate или JPA. Итак, я пытаюсь понять, как заставить это работать для моей работы - я должен продемонстрировать что-то в понедельник, и если я смогу заставить "это" работать, я скопирую это на свой рабочий ноутбук и изменю подробности конечно. Кстати - вот сообщение, которое я получаю - мне пришлось сократить его в заголовке:

«Класс org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider не реализует запрошенный интерфейс javax.persistence.spi.PersistenceProvider»

У меня есть "основной" класс - TestWebApplication:

package net.draconia.testWeb;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.annotation.Bean;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

@SpringBootApplication(scanBasePackages = {"com.draconia.testWeb.controller"})
public class TestWebApplication
{
    
    @Bean
    public DataSource getDatasource()
    {
        BasicDataSource objDatasource = new BasicDataSource();
        
        objDatasource.setDriverClassName("com.mysql.jdbc.Driver");
        objDatasource.setUrl("jdbc:mysql://localhost:3306/Test");
        objDatasource.setUsername("root");
        objDatasource.setPassword("R3g1n@ M1lL$ 1$ My Qu3eN!");
        
        return(objDatasource);
    }
    
    @Bean
    public LocalContainerEntityManagerFactoryBean getEntityManagerFactory()
    {
          LocalContainerEntityManagerFactoryBean objEntityManager = new LocalContainerEntityManagerFactoryBean();
          
          objEntityManager.setDataSource(getDatasource());
          objEntityManager.setPackagesToScan(new String[] { "net.draconia.testWeb.beans" });

          JpaVendorAdapter objVendorAdapter = new HibernateJpaVendorAdapter();
          objEntityManager.setJpaVendorAdapter(objVendorAdapter);
          objEntityManager.setJpaProperties(getHibernateProperties());

          return(objEntityManager);
   }
    
    protected Properties getHibernateProperties()
    {
        Properties objHibernateProperties = new Properties();
        
        objHibernateProperties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
        objHibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        
        return(objHibernateProperties);
    }
    
    @Bean
    public JpaTransactionManager getHibernateTransactionManager()
    {
        JpaTransactionManager objTransactionManager = new JpaTransactionManager();
        
        objTransactionManager.setEntityManagerFactory(getEntityManagerFactory().getObject());
        
        return(objTransactionManager);
    }
    
    public static void main(String[] args)
    {
        SpringApplication.run(TestWebApplication.class, args);
    }
}

, объектный компонент:

package net.draconia.testWeb.beans;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity(name = "Books")
public class Book
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer miId;
    
    @Column(columnDefinition = "varchar(200) not null", insertable = true, length = 200, name = "BookName", nullable = false, table = "Books", unique = false, updatable = true)
    private String msBookName;
    
    @Column(columnDefinition = "varchar(100) not null", insertable = true, length = 100, name = "Author", nullable = false, table = "Books", unique = false, updatable = true)
    private String msAuthor;
    
    public String getAuthor()
    {
        if (msAuthor == null)
            msAuthor = "";
        
        return(msAuthor);
    }
    
    public String getBookName()
    {
        if (msBookName == null)
            msBookName = "";
        
        return(msBookName);
    }
    
    public int getId()
    {
        if (miId == null)
            miId = 0;
        
        return(miId);
    }
    
    public void setAuthor(final String sAuthor)
    {
        if (sAuthor == null)
            msAuthor = "";
        else
            msAuthor = sAuthor;
    }
    
    public void setBookName(final String sBookName)
    {
        if (sBookName == null)
            msBookName = "";
        else
            msBookName = sBookName;
    }
    
    public void setId(final Integer iId)
    {
        if (iId == null)
            miId = 0;
        else
            miId = iId;
    }
}

, класс DAOConcrete (интерфейс — это всего лишь один метод, который логичен, но если хотите, я тоже его опубликую):

package net.draconia.testWeb.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Repository;

import net.draconia.testWeb.beans.Book;

@Repository("bookDAO")
public class BookDAOImpl implements BookDAO
{
    @Autowired
    private EntityManagerFactory mObjEntityManagerFactory;
    
    public List<Book> getAllBooks()
    {
        EntityManager objEntityManager = getEntityManagerFactory().createEntityManager();
        List<Book> lstBooks = objEntityManager.createQuery("from Books", Book.class).getResultList();
        
        return(lstBooks);
    }
    
    protected EntityManagerFactory getEntityManagerFactory()
    {
        return(mObjEntityManagerFactory);
    }
}

и класс контроллера для конечных точек REST/контроллера MVC:

package net.draconia.testWeb.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import net.draconia.testWeb.beans.Book;
import net.draconia.testWeb.dao.BookDAO;

@Controller
public class TestController
{
    @Autowired
    private BookDAO mObjDAO;
    
    @GetMapping("/Books")
    public List<Book> getBooks()
    {
        return(getDAO().getAllBooks());
    }
    
    protected BookDAO getDAO()
    {
        return(mObjDAO);
    }
}

Файл POM здесь только для полноты, но я не думаю, что это обязательно проблема, если я не упустил зависимость:

<?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 https://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.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>net.draconia</groupId>
    <artifactId>testWeb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>testWeb</name>
    <description>Demo project for Spring Boot</description>
    
    <properties>
        <hibernate.version>6.1.0.Final</hibernate.version>
        <java.version>11</java.version>
        <mysql.version>8.0.29</mysql.version>
        <spring.version>5.3.2</spring.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.13.3</version>
        </dependency>
        <dependency>
            <groupId>jakarta.persistence</groupId>
            <artifactId>jakarta.persistence-api</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.orm</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>

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

Если вы обратите внимание, я включаю зависимость для библиотеки Джексона, потому что список книг должен возвращаться как объект JSON. Я не думаю, что это проблема, а просто говорю - и я, вероятно, мог бы удалить это для этого, но тогда, когда он запустится, список книг будет непонятен для меня, получая ответ, когда / если это сработает. Что я делаю не так???

Неправильные зависимости. Вы уверены, что можете использовать ORM 6 с Spring 5.3?

Davide D'Alto 26.06.2022 15:31

В HBN6 они перешли на jakarta.persistence-api-3.0.0, и теперь FQCN PersistenceProvider в новом persistence-api — jakarta.persistence.spi.PersistenceProvider. В принципе, современный HBN6 не совместим с пружиной.

Andrey B. Panfilov 26.06.2022 15:33

Андрей, что значит FQCN? После публикации я предположил, что, поскольку он продолжает принимать Джакарту, я сейчас использую версию классов Джакарты. У меня уже была jakarta-persistence в файле maven. Но я не уверен, что делать с кодом, чтобы получить результаты, которые я хочу.

Seth D. Fulmer 26.06.2022 16:27

Дэвид, я не уверен, но мне нужно использовать Spring -Boot и Hibernate с JPA, и я не могу позволить себе роскошь использовать репозитории Spring-JPA, потому что власть имущие проделали дерьмовую работу по организации БД - там нет посторонних ключи или что-то еще и несколько первичных ключей, таких как Id, поэтому я делаю все возможное для создания запросов и сущностей Hibernate. Я только что использовал Книги, чтобы проверить это для себя на своем персональном компьютере, но когда я заработаю, я могу скопировать его в свой рабочий пример.

Seth D. Fulmer 26.06.2022 16:30

FQCN — полное имя класса. Spring data ожидает javax.persistence.spi.PersistenceProvider, HBN6 использует jakarta.persistence.spi.PersistenceProvider. Вам нужно переключиться на HBN5.

Andrey B. Panfilov 26.06.2022 16:38

Сейчас я пытаюсь найти учебник по Hibernate 5. Последней версией, которую я использовал, была 4.x, и я не помню и не имею никаких старых проектов, связанных с ней, по крайней мере, ничего с JPA - тогда это были все файлы XML. Я найду это сейчас, когда я знаю, что нужно использовать более старую версию, и я просто скажу своим коллегам, что это должно быть - пока не выйдет, по крайней мере, новая версия Spring или Hibernate.

Seth D. Fulmer 26.06.2022 17:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
324
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Меняем спящий режим на версию 5.6.9.Final:

<hibernate.version>5.6.9.Final</hibernate.version>

Спасибо - в итоге я это сделал - очевидно, это уже внутри Spring Boot 2.7.1, поэтому я просто удалил версию и сохранил зависимость от спящего режима. Извините, что так долго комментировал - так как я нашел ответ самостоятельно, я не удосужился вернуться

Seth D. Fulmer 09.07.2022 16:57

Другие вопросы по теме

Похожие вопросы

Может ли любой случайный Java-сервер выступать в качестве производителя в Apache Kafka?
Выполнение модульных тестов с помощью Spark 3.3.0 на Java 17 завершается с ошибкой IllegalAccessError: класс StorageUtils не может получить доступ к классу sun.nio.ch.DirectBuffer
Как написать алгоритм для нахождения максимально возможного веса посылки
Преобразование List<char[]> в массив char[] без использования System.arraycopy()
Ошибка при импорте проектов Springboot 2.7 в intellij Idea с maven 3.8.5
Учитывая массив целых чисел nums и целочисленную цель, вернуть индексы двух чисел так, чтобы они складывались в цель
Для работы плагина flutter:Android Gradle требуется Java 11. В настоящее время вы используете Java 1.8
Весенняя загрузка - org.postgresql.util.PSQLException: FATAL: аутентификация пароля не удалась для пользователя "postgres"
Не удалось найти среду выполнения Java, которая поддерживает javaws, хотя установлена ​​Java 8
Как преобразовать Long в BigDecimal, используя при этом поток