Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

743
30 июня 2017, 05:58

Полный текст ошибки:

29-Jun-2017 06:32:09.466 SEVERE [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class com.ystu.main.StartStopListener
 java.lang.ExceptionInInitializerError: Initial SessionFactory failed: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
    at com.ystu.jpa_hibernate.HibernateSessionFactory.buildSessionFactory(HibernateSessionFactory.java:21)
    at com.ystu.jpa_hibernate.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java:10)
    at com.ystu.main.StartStopListener.contextInitialized(StartStopListener.java:25)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4735)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5197)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:596)
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1805)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
    at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:506)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:405)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1595)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:280)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1184)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1412)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1380)
    at java.lang.Thread.run(Thread.java:745)

В HibernateSessionFactory.java находится это:

import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class HibernateSessionFactory {
    private static SessionFactory sessionFactory = buildSessionFactory();
    private static SessionFactory buildSessionFactory() {
        final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure("hibernate.cfg.xml")
                .build();
        try {
            sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
        }
        catch (Exception e) {
            StandardServiceRegistryBuilder.destroy( registry );
            throw new ExceptionInInitializerError("Initial SessionFactory failed: " + e);
        }
        return sessionFactory;
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

То есть, ошибка возникает на команде sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();. Предыдущая команда реестр создаёт - проверял. Исключение возникает на этапе buildMetadata(), а конкретно - в этом месте:

public static <T> T getMessageLogger(final Class<T> type, final String category, final Locale locale) {
...
    if(loggerClass == null) {
        try {
            loggerClass = Class.forName(Logger.join(typeName, "$logger", (String)null, (String)null, (String)null), true, classLoader).asSubclass(type);
        } catch (ClassNotFoundException var13) {
            throw new IllegalArgumentException("Invalid logger " + type + " (implementation not found in " + classLoader + ")");
        }
    }
...
}

Но это не точно. Я не знаю внутренних тонкостей Hibernate, просто предположение, связанное с исключениями внутри метода.

В hibernate.cfg.xml, который находится, как и положено, в src.main.resources, находится это:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="connection.url">jdbc:mysql://localhost:3306/java_store?autoReconnect=true;‌​useSSL=false;</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.username">username</property>
    <property name="connection.password">password</property>
    <property name="hbm2ddl.auto">update</property>
    <mapping class="com.ystu.jpa_hibernate.entity.GoodsEntity"/>
    <mapping class="com.ystu.jpa_hibernate.entity.GoodsUsersEntity"/>
    <mapping class="com.ystu.jpa_hibernate.entity.UsersEntity"/>
  </session-factory>
</hibernate-configuration>

username и password соответствуют действительности. База данных существует.

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

import javax.persistence.*;
@Entity
@Table(name = "goods_users", schema = "java_store")
public class GoodsUsersEntity {
    private long id;
    private UsersEntity user;
    private GoodsEntity good;
    @Id
    @Column(name = "id", nullable = false, insertable = false, updatable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    @ManyToOne (cascade = {CascadeType.REFRESH})
    @JoinColumn(name="id", nullable = false)
    public UsersEntity getUser() {
        return user;
    }
    public void setUser(UsersEntity user) {
        this.user = user;
    }
    @ManyToOne (cascade = {CascadeType.REFRESH})
    @JoinColumn(name="id", nullable = false)
    public GoodsEntity getGood() {
        return good;
    }
    public void setGood(GoodsEntity good) {
        this.good = good;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        GoodsUsersEntity that = (GoodsUsersEntity) o;
        return id == that.id && user == that.user && good == that.good;
    }
    @Override
    public int hashCode() {
        return (int) (id ^ (id >>> 32));
    }
}

Остальные по структуре и семантически отличаются только заменой @ManyToOne на @OneToMany:

private Set<GoodsUsersEntity> goods_users = new HashSet<>();
...
@OneToMany(mappedBy = "good", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    public Set<GoodsUsersEntity> getGoods_users() {
        return this.goods_users;
}

Делал по примеру отсюда с учётом ответов по моей проблеме в чужих темах на английском SO. Ответы не помогают. Это печально.

Есть подозрение, что это может быть несовместимостью моих версий Hibernate и MySQL Connector/J. Поэтому также код из pom.xml:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>5.2.10.Final</version>
</dependency>

Если кто-то что-то знает, был бы признателен.

UPD: найдена ещё такая запись в логе, которая говорит, видимо, о том, что драйвер JDBC не очень прогрузился, хотя в Maven он есть (в виде Maven: mysql:mysql-connector-java:6.0.6):

org.hibernate.service.internal.AbstractServiceRegistryImpl.stopService HHH000369:
Error stopping service [class org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl]
 : java.lang.NullPointerException
READ ALSO
Как отправить сообщение боту в Telegram через java?

Как отправить сообщение боту в Telegram через java?

Подскажите что не так код почему то не работаетВот мой код: curl "https://api

800
Как убрать автоподставку комментария git

Как убрать автоподставку комментария git

Как в Intellije Idea убрать автоподставку комментария при коммите?

321
Стек технологий для понимания Rest java?

Стек технологий для понимания Rest java?

Что изучать, чтобы научиться писать\понимать restfull сервисы на javaИнтересует стек технологий

244
Selenium Webdriver

Selenium Webdriver

Доброго дня, коллегиЕсть написанный тест на java

235