Java Hibernate - 无法连接到H2

问题描述 投票:1回答:1

我需要帮助。我不知道这个项目有什么问题。我无法连接到h2数据库。即使我没有持久存在任何对象,只是关闭连接,我也会收到错误。

对不起,我知道,有几次被问过,但没有一个答案适合我的情况。

我得到的错误:

org.hibernate.Version logVersion INFO:HHH000412:Hibernate Core {5.2.12.Final} 2019年3月4日11:00:24 org.hibernate.cfg.Environment信息:HHH000206:03年4月4日11:00:24 org.hibernate.Version logVersion hibernate.properties not found Mar 04,20199 11:00:24 PM org.hibernate.boot.jaxb.in​​ternal.stax.LocalXmlResourceResolver resolveEntity WARN:HHH90000012:已识别的过时hibernate名称空间http://hibernate.sourceforge.net/hibernate-configuration。请改用名称空间http://www.hibernate.org/dtd/hibernate-configuration。可以随时删除对过时的DTD / XSD命名空间的支持。 org.hibernate.annotations.common.reflection.java.JavaReflectionManager INFO:HCANN000001:Hibernate Commons Annotations {5.0.1.Final} 2010年3月4日11:00:25 org.hibernate .engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl配置WARN:HHH10001002:使用Hibernate内置连接池(不供生产使用!)org.hibernate.service.spi.ServiceException:无法创建请求的服务[org.hibernate.engine org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:271)中的org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:233)中的.jdbc.env.spi.JdbcEnvironment]。位于org.hibernate.boot.registry.internal.StandardServiceRegistryImpl的org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)中的hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:210)。 CONF igService(StandardServiceRegistryImpl.java:94)位于org.hibernate的org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:242)org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:210)位于org.hibernate.boot.model的org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111)中的.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352)位于org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java)的org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)中的.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83) :87)org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691)org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)orm.hibernate.employees.HibernateUtils。(HibernateUtils.java) :13)at orm.hibernate.employees.EmployeesApp.main(EmployeesApp.java:21)中的orm.hibernate.employees.EmployeeRepository.addNewEmployee(EmployeeRepository.java:16)引起:org.hibernate.boot.registry.classloading.spi.ClassLoadingException:无法在org.hibernate.engine.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:348)的org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.loadDriverIfPossible中加载类[org.h2.Driver] (DriverManagerConnectionProviderImpl.java:160)org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildCreator(DriverManagerConnectionProviderImpl.java:116)org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java) :100)在org.hibernate.boot.regist的org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:72) org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:242)中的ry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94) 210)org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)at org位于org.hibernate.service.internal的org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88)的.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) .AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:259)... 16更多引起:java.lang.ClassNotFoundException:无法加载请求d class:org.hhiber org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl $ AggregatedClassLoader.findClass(ClassLoaderServiceImpl.java:336)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at java位于org.hibernate.boot.registry.classloading的java.lang.Class.forName(Class.java:348)java.lang.Class.forName0(Native Method)的.lang.ClassLoader.loadClass(ClassLoader.java:357) .internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:345)... 28更多

##### Initial SessionFactory creation failed.org.hibernate.service.spi.ServiceException: Unable to create

请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]线程“main”中的异常java.lang.ExceptionInInitializerError:连接数据库错误! orm.hibernate.employees.HibernateUtils。(HibernateUtils.java:17)orm.hibernate.employees.EmployeesApp.main上的orm.hibernate.employees.EmployeeRepository.addNewEmployee(EmployeeRepository.java:16)(EmployeesApp.java:21)

进程以退出代码1结束

pom.hml:

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

java hibernate orm persistence
1个回答
1
投票

您的应用程序无法在运行时找到您的数据库驱动程序,因此错误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>

拜拜!

© www.soinside.com 2019 - 2024. All rights reserved.