Java Hibernate - невозможно подключиться к H2 - PullRequest
0 голосов
/ 04 марта 2019

Мне нужна помощь.Я понятия не имею, что не так с этим проектом.Я не могу подключиться к базе данных h2.Я получаю ошибку, даже если я не сохраняю какой-либо объект, просто закрываю соединение.

Извините, я знаю, что его задавали несколько раз, но ни один из ответов не подходит для моего случая.

Ошибка, которую я получаю:

04 марта,2019 23:00:24 PM org.hibernate.Version Log Информация о версии: HHH000412: Hibernate Core {5.2.12.Final} 04 марта 2019 г. 23:00:24 org.hibernate.cfg.Environment INFO: HHH000206: hibernate.propertiesне найден 04 марта 2019 23:00:24 вечера org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolEntity WARN: HHH90000012: Распознанное устаревшее пространство имен спящего режима http://hibernate.sourceforge.net/hibernate-configuration. Вместо этого используйте пространство имен http://www.hibernate.org/dtd/hibernate-configuration.Поддержка устаревших пространств имен DTD / XSD может быть удалена в любое время.04 марта 2019 г. 23:00:24 вечера org.hibernate.annotations.common.reflection.java.JavaReflectionManager ИНФОРМАЦИЯ: HCANN000001: Hibernate Commons Annotations {5.0.1.Final} 04 марта 2019 г. 23:00:25 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: использование встроенного пула соединений Hibernate (не для производственного использования!) org.hibernate.service.spi.ServiceException: невозможно создать запрошенную службу [org.hibernate.engine.jdbc.env.spi.hibernate.service.internal.конфigureService (StandardServiceRegistryImpl.java:94) в org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService (AbstractServiceRegistryImpl.java:242) в org.hibernate.service.internal.AbstractSerg.jergergSerg.boot.model.process.spi.MetadataBuildingProcess.handleTypes (MetadataBuildingProcess.java:352) в org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete (MetadataBuildingPromo...process. spi: 87) в org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:691) в org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:726) в orm.hibernate.employees.HibernateUtils. (HibernateUtils.java.: 13) вorm.hibernate.employees.EmployeeRepository.addNewEmployee (EmployeeRepository.java:16) в orm.hibernate.employees.EmployeesApp.main (EmployeesApp.java:21). Вызывается: org.hibernate.boot.registry.classloadL.Невозможно загрузить класс [org.h2.Driver] по адресу org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName (ClassLoaderServiceImpl.java:348) в org.hibernate.engine.jdbc.connections.inagerrinePrimPrim_PriverPriverMid:: 100) в org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure (DriverManagerConnectionProviderImpl.java:72) вorg.hibernate.getService (AbstractServiceRegistryImpl.java:210) в org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess (JdbcEnvironmentInitiator.java:145) в org.hibernate.environment.injbjava: 66) в org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService (JdbcEnvironmentInitiator.java:35) в org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.inavaService (org) ing.jpg.hibernate.service.internal.AbstractServiceRegistryImpl.createService (AbstractServiceRegistryImpl.java:259) ... еще 16 причин: java.lang.ClassNotFoundException: Не удалось загрузить запрошенный класс: org.h2.Driver в org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl $ AggregatedClassLoader.findClass (ClassLoaderServiceImpl.java:336) в java.lang.ClassLoader.o424) в java.lang.ClassLoader.loadClass (ClassLoader.java:357) в java.lang.Class.forName0 (собственный метод) в java.lang.Class.forName (Class.java:348) в org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName (ClassLoaderServiceImpl.java:345) ... еще 28

##### Начальное создание SessionFactory не удалось.org.hibernate.service.spi.ServiceException: невозможно создать

запрошенный сервис [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] Исключение в потоке "main" java.lang.ExceptionInInitializerError: Ошибка подключения к базе данных!в orm.hibernate.employees.HibernateUtils. (HibernateUtils.java:17) в orm.hibernate.employees.EmployeeRepository.addNewEmployee (EmployeeRepository.java:16) в orm.hibernate.employees.EmployeesA21.jj.jpg ()

Процесс завершен с кодом завершения 1

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>

    <groupId>brudnopis.com</groupId>
    <artifactId>brudnopis2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.12.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.196</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>

Hibernate Utils класс:

public class HibernateUtils {

    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
        } catch (Throwable ex) {
            ex.printStackTrace();
            System.err.println("########### Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError("Connection to database error!");
        }
    }

    public static Session openSession() throws Exception {
        Session session;
        try {
            session = sessionFactory.openSession();
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("Connection to database error!");
        }
        return session;
    }

    public static void closeSession(){
        sessionFactory.close();
    }
}

Репозиторий

public class EmployeeRepository {

    // Create

    public static void addNewEmployee(EmployeeEntity employee){

        Session session = null;
        try {
            session = HibernateUtils.openSession();
            session.getTransaction().begin();
            session.saveOrUpdate(employee);
            session.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
    }

    // Read

    public static List<EmployeeEntity> listAllEmployees(){

        List<EmployeeEntity> listEmployees = new ArrayList<EmployeeEntity>();

        Session session = null;
        try {
            session = HibernateUtils.openSession();
            listEmployees = session.createQuery("SELECT e FROM EmployeeEntity e").getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
        return listEmployees;
    }

    // Update

    public static void editExistingEmployee(EmployeeEntity employee){

        Session session = null;
        try {
            session = HibernateUtils.openSession();
            session.getTransaction().begin();
            session.merge(employee);
            session.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
    }

    //Delete

    public static void deleteEmployee(int idToDelete){

        Session session = null;
        try {
            session = HibernateUtils.openSession();
            EmployeeEntity employeeToDelete = session.find(EmployeeEntity.class, idToDelete);
            session.getTransaction().begin();
            session.remove(employeeToDelete);
            session.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
    }
}

Класс сущности:

@Entity
@Table(name = "employees")
public class EmployeeEntity {

    @Id
    @Column(name = "id")
    private int id;
    @Column(name = "employee_id")
    private int employeeId;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;

    public EmployeeEntity(int id, int employeeId, String firstName, String lastName) {
        this.id = id;
        this.employeeId = employeeId;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public EmployeeEntity(){}

    @Override
    public String toString() {
        return "EmployeeEntity{" +
                "id=" + id +
                ", employeeId=" + employeeId +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

Основной класс:

public class EmployeesApp {
    public static void main(String[] args) throws Exception {

        Scanner sc = new Scanner(System.in);

        System.out.println("Menu");
        System.out.println("====");
        System.out.println("1. Write data to database");
        System.out.println("2. Read data from database");
        System.out.println("3. Exit");

        int userChoice = sc.nextInt();

        switch(userChoice){
            case 1:
                EmployeeEntity employee1 = new EmployeeEntity(1,10001,"Jon", "Doe");
                EmployeeRepository.addNewEmployee(employee1);
                System.out.println(EmployeeRepository.listAllEmployees());
            case 3:
                break;
        }
        HibernateUtils.closeSession();
    }
}

Структура проекта:

enter image description here

1 Ответ

0 голосов
/ 05 марта 2019

Ваше приложение не может найти драйвер базы данных во время выполнения, поэтому возникает ошибка Caused by: java.lang.ClassNotFoundException: Could not load requested class : org.h2.Driver.

Измените свою зависимость H2 следующим образом:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.196</version>
        <scope>runtime</scope> <!-- Here you are saying this dependency is needed at runtime, not just at testing -->
    </dependency>

Увидимся!

...