EntityManagerFactory не инициализируется

Я НЕ использую EJB/Spring и т.д.

Только Jpa + Servlet.

я пытаюсь проинициализировать

public abstract class AbstractEntityManagerFactory {

    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernateTask");

    public static EntityManager getEntityManager(){
        return emf.createEntityManager();
    }

Когда я запускаю его через public static void main(String[] args) - всё работает шикарно.

Но если использовать Tom Cat 9.0.58 - получаю ошибку:

05-Apr-2022 22:58:58.985 INFO [http-nio-8080-exec-4] org.hibernate.service.internal.AbstractServiceRegistryImpl.stopService HHH000369: Error stopping service [class org.hibernate.hikaricp.internal.HikariCPConnectionProvider]
        java.lang.NullPointerException: Cannot invoke "com.zaxxer.hikari.HikariDataSource.close()" because "this.hds" is null
            at org.hibernate.hikaricp.internal.HikariCPConnectionProvider.stop(HikariCPConnectionProvider.java:122)
            at org.hibernate.service.internal.AbstractServiceRegistryImpl.stopService(AbstractServiceRegistryImpl.java:390)
            at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.cleanup(EntityManagerFactoryBuilderImpl.java:1449)
            at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1508)
            at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
            at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
            at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
            at com.aimprosoft.hopak.factory.AbstractEntityManagerFactory.<clinit>(AbstractEntityManagerFactory.java:9)

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
             xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="HibernateTask">
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="hibernate.hikari.jdbcUrl" value="jdbc:mysql://localhost:3306/Departments"/>
            <property name="hibernate.hikari.username" value="root"/>
            <property name="hibernate.hikari.password" value="ISBN97859910"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>

            <property name="hibernate.connection.provider_class" value="org.hibernate.hikaricp.internal.HikariCPConnectionProvider"/>
            <property name="hibernate.hikari.connectionTimeout" value="20000"/>
            <property name="hibernate.hikari.idleTimeout" value="150000"/>
            <property name="hibernate.hikari.maximumPoolSize" value="10"/>
            <property name="hibernate.hikari.poolName" value="HikariPool"/>

            <property name="hibernate.hikari.autoCommit" value="true"/>
            <property name="hibernate.hikari.maxLifetime" value="90000"/>

        </properties>
    </persistence-unit>

</persistence>

Я думаю, что это связано с каким-то особенным объявлением EntityManagerFactory.

У меня есть реализация на чистом jdbc. Если сначала я выполню запрос на нём. То при помощи магии всё сработает инициализируется.

На данный момент у меня 2 кнопки на странице.

Department - (JDBC) Employee - (JPA)

Если я сразу нажму на Employee(JPA) - получу NullPointerException, но если сначала на Department(JDBC), а потом Employee(JPA) - всё работает как часики.

Возможно какая-то проблема с статической инициализацией?

Вызов

public class JpaTransactionManager {

    public static <T> T doInTransaction(JpaTransactionCallback<T> callback) {

        EntityManager em = AbstractEntityManagerFactory.getEntityManager(); // Попытка инициализации
        T result = null;

        em.getTransaction().begin();
        result = callback.execute(em);
        em.getTransaction().commit();

        Log.logger.info("Transaction is done");
        em.close();
        return result;
    }
}

pom.xml

<dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.6.7.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.6.7.Final</version>
        </dependency>

        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>5.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-hikaricp</artifactId>
            <version>5.6.7.Final</version>
        </dependency>

    </dependencies>

Ответы (1 шт):

Автор решения: Илья Гопак

Проблема в том, что Hibernate не мог подтянуть файл. Несмотря на то, что всё лежит на своих местах, он попросту не может это сделать.

Решение: Просто всё сделал через через SessionFactory, а не emf

→ Ссылка