Полный текст ошибки:
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
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите что не так код почему то не работаетВот мой код: curl "https://api
Как в Intellije Idea убрать автоподставку комментария при коммите?
Что изучать, чтобы научиться писать\понимать restfull сервисы на javaИнтересует стек технологий