Весь день уже мучаюсь, не знаю что делать.
Есть обычный 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
, то тогда всё начинает работать, только тогда как подгружать выбранные ссылки если иногда они нужны, а иногда нет?
Надо писать правильно
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
в запросах не меняет результат выборки данных, а использует дополнительные запросы для инициализации объектов, то их можно убрать и использовать стратегию загрузки обектов, используемую в аннотациях маппинга.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Начал делать приложение и пытаюсь сделать single page applicationДля этого я создал один маппинг на "/":
Я новичок в Spring MVC и thymeleafНаписал работающий код, но есть подозрение, что я использую костыли в контроллере и форме (результат поверхностного...
Имеется утилита, которая запускает батники, которые в свою очередь собирают инфу с помощью утилиты wmic и потом с них форматирует отчет на рабочий...