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