Не конфигурируется Hibernate

213
11 октября 2018, 15:40

Весь день уже мучаюсь, не знаю что делать.

Есть обычный HibernateUtil:

public class HibernateUtil {
    private static SessionFactory sessionFactory;
    static {
        sessionFactory = new Configuration().configure().buildSessionFactory();
        System.out.println(sessionFactory);
    }
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
}

Вот мой hibernate.cfg.xml:

<?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="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/deepThoughtDB</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">228322</property>
    <property name="hbm2ddl.auto">update</property>
    <property name="show_sql">true</property>
      <mapping class="ru.projects.prog_ja.entity.Facts"/>
      <mapping class="ru.projects.prog_ja.entity.Tags"/>
      <mapping class="ru.projects.prog_ja.entity.questions.QuestionContent"/>
      <mapping class="ru.projects.prog_ja.entity.questions.QuestionImages"/>
      <mapping class="ru.projects.prog_ja.entity.questions.Questions"/>
      <mapping class="ru.projects.prog_ja.entity.posts.PostContent"/>
      <mapping class="ru.projects.prog_ja.entity.posts.PostImage"/>
      <mapping class="ru.projects.prog_ja.entity.posts.PostInsideImages"/>
      <mapping class="ru.projects.prog_ja.entity.posts.PostsComments"/>
      <mapping class="ru.projects.prog_ja.entity.posts.PostsInfo"/>
      <mapping class="ru.projects.prog_ja.entity.user.LogInfo"/>
      <mapping class="ru.projects.prog_ja.entity.user.UserImages"/>
      <mapping class="ru.projects.prog_ja.entity.user.UserInfo"/>
      <mapping class="ru.projects.prog_ja.entity.answer.AnswerImages"/>
      <mapping class="ru.projects.prog_ja.entity.answer.Answer"/>
      <!-- DB schema will be updated if needed -->
  </session-factory>
</hibernate-configuration>

Из xml видно, что здесь замаплены сущности, ну и вот проблема заключается в том, что у меня вылетает NullPointerException в классе HibernateUtil,в строке где происходит конфигурация.

Вот такого содержания:

Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@393881f0] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
авг 02, 2018 4:29:53 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
авг 02, 2018 4:29:53 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/deepThoughtDB]
Exception in thread "main" java.lang.ExceptionInInitializerError
    at TestMain.session(TestMain.java:20)
    at TestMain.run(TestMain.java:24)
    at TestMain.main(TestMain.java:16)
Caused by: java.lang.NullPointerException
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:429)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3920)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3706)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3584)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:720)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:576)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:313)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:271)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
    at org.hibernate.query.spi.NamedQueryRepository.checkNamedQueries(NamedQueryRepository.java:157)
    at org.hibernate.internal.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:574)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:321)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
    at ru.projects.prog_ja.dao.Hibernate.HibernateUtil.<clinit>(HibernateUtil.java:17)
    ... 3 more

Но, когда я убираю из hibernate.cfg.xml все маппинги, он нормально запускается. Помимо того он нормально запускается если я убираю все @NamedQueries над своими Entity, т.е. у меня на каждом Entity есть NamedQuery и если я убираю их всех до одного, то Hibernate работает, но если я оставляю хоть 1, то вылетает NPE, в чем может быть проблема?

ОБНОВЛЕНИЕ:

Пример одного из таких query, мб они просто не правильно написаны

select u from LogInfo l 
join fetch l.userInfo u 
join fetch u.userImage ui 
join fetch ui.imageS imgS
where l.mailH = :mail and l.passH = :pass

(При xml mapping-e Entity та же самая ситуация)

ОБНОВЛЕНИЕ 2:

Если убрать из запросов join fetch, то тогда всё начинает работать, только тогда как подгружать выбранные ссылки если иногда они нужны, а иногда нет?

Answer 1

Надо писать правильно

select u from LogInfo as l 
inner join l.userInfo as u 
inner join u.userImage as ui 
inner join ui.images 

Как писать запросы и типы джойнов можно посмотреть здесь.

Соединение fetch позволяет инициализировать ассоциации или коллекции значений вместе с их родительскими объектами с использованием одного select. Это особенно полезно в случае коллекций. Оно эффективно перекрывает outer join и ленивые объявления в файле маппинга для ассоциаций и коллекций. Дополнительную информацию см. В разделе 19.1 «fetch-стратегии».

Поскольку использование fetch в запросах не меняет результат выборки данных, а использует дополнительные запросы для инициализации объектов, то их можно убрать и использовать стратегию загрузки обектов, используемую в аннотациях маппинга.

READ ALSO
SpringBoot Single Page Application

SpringBoot Single Page Application

Начал делать приложение и пытаюсь сделать single page applicationДля этого я создал один маппинг на "/":

181
Интеграция Apache2 и Tomcat 9

Интеграция Apache2 и Tomcat 9

Установил Apache, Tomcat и mod_jkЧасть worker

207
Как улучшить запросы в контроллере и форме для вложенных объектов?

Как улучшить запросы в контроллере и форме для вложенных объектов?

Я новичок в Spring MVC и thymeleafНаписал работающий код, но есть подозрение, что я использую костыли в контроллере и форме (результат поверхностного...

186
Проблема с кодировками

Проблема с кодировками

Имеется утилита, которая запускает батники, которые в свою очередь собирают инфу с помощью утилиты wmic и потом с них форматирует отчет на рабочий...

178