Hibernate SessionFactory всегда NULL

175
18 декабря 2018, 22:50

Всем привет! У меня очень странная проблема, буквально час назад у меня все собиралось, но сейчас перестало. Хотя я ничего не менял :(

Суть проблемы: Почему-то начал ловить следующий Stacktrace:

java.lang.NullPointerException
at org.postgresql.jdbc2.AbstractJdbc2DatabaseMetaData.getColumns(AbstractJdbc2DatabaseMetaData.java:2502)
at org.postgresql.jdbc4.AbstractJdbc4DatabaseMetaData.getColumns(AbstractJdbc4DatabaseMetaData.java:99)
at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.populateTablesWithColumns(InformationExtractorJdbcDatabaseMetaDataImpl.java:350)
at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.getTables(InformationExtractorJdbcDatabaseMetaDataImpl.java:337)
at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.getTablesInformation(DatabaseInformationImpl.java:120)
at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:65)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:207)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:114)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:183)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
at DBLayout.HibernateUtil.getSessionFactory(HibernateUtil.java:25)
at DBLayout.DataLayout.getAllShop(DataLayout.java:17)
at Managers.ShopManager.getAllShop(ShopManager.java:15)
at controllers.controller.getShop(controller.java:21)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:491)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:764)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1388)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:844)

Вот мой синглтон для hibernate :

package DBLayout;
import DataModel.Liquid;
import DataModel.LiquidInShop;
import DataModel.Shop;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private HibernateUtil() {}
    public static SessionFactory getSessionFactory() {
        if (sessionFactory == null) {
            try {
                Configuration configuration = new Configuration().configure();
                configuration.addAnnotatedClass(LiquidEntity.class);
                configuration.addAnnotatedClass(ShopsEntity.class);
                configuration.addAnnotatedClass(LiquidsXShopEntity.class);
                configuration.addAnnotatedClass(LiquidInShop.class);
                configuration.addAnnotatedClass(Liquid.class);
                StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
                sessionFactory = configuration.buildSessionFactory(builder.build());
            } catch (Exception e) {
                System.out.println("Исключение!" + e);
                e.printStackTrace();
            }
        }
        return sessionFactory;
    }
}

Вот мои конфиги к нему:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM

        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:postgresql://localhost:5432/postgres</property>
        <property name="connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL94Dialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="connection.username">postgres</property>
        <property name="connection.password">od3FQGcT</property>
        <property name="show_sql">false</property>

        <mapping class="DBLayout.LiquidEntity"/>
        <mapping class="DBLayout.LiquidsXShopEntity"/>
        <mapping class="DBLayout.ShopsEntity"/>
        <mapping class="DataModel.LiquidInShop"/>
        <mapping class="DataModel.Shop"/>
        <mapping class="DataModel.Liquid"/>
    </session-factory>
</hibernate-configuration>

Вот мой слой бд:

package DBLayout;
import DataModel.Liquid;
import DataModel.LiquidInShop;
import DataModel.Shop;
import org.hibernate.Session;
import org.hibernate.query.Query;
import java.util.ArrayList;
import java.util.List;
import static DBLayout.HibernateUtil.getSessionFactory;
public class DataLayout {
    public DataLayout(){
    }
    public List getAllShop(){
        return getSessionFactory().openSession().createQuery("from ShopsEntity ").list();
    }
    public List getAllLiquid(){
        return getSessionFactory().openSession().createQuery("from LiquidEntity ").list();
    }
    public List getLiquidsFromCurrentShop(String id){
        return HibernateUtil.getSessionFactory().openSession().createNativeQuery("select t2.id, t1.shop_id as shopid, t2.company, t2.image, t2.taste, t2.description, t1.nicotine, t1.price , t1.amont" +
                " from postgres.public.liquids_x_shop as t1 " +
                "inner join postgres.public.liquid as t2 on (t1.liquid_id = t2.id)" +
                "where t1.shop_id ="+id , LiquidInShop.class).getResultList();
    }
    public List getShopsFromCurrentLiquid(String id){
        return HibernateUtil.getSessionFactory().openSession().createNativeQuery("select t3.id, t1.shop_id as shopid, t2.company, t3.image, t2.taste, t3.description, t1.nicotine, t1.price, t1.amont " +
                "from postgres.public.liquids_x_shop as t1 " +
                "inner join postgres.public.liquid as t2 on (t1.liquid_id = t2.id)" +
                "inner join postgres.public.shops as t3 on (t1.shop_id = t3.id)" +
                "where t1.liquid_id ="+id , LiquidInShop.class).getResultList();
    }
    public LiquidInShop getLiquidById(String id, String shopid){
        return HibernateUtil.getSessionFactory().openSession().createNativeQuery("select t2.id, t1.shop_id as shopid, t2.company, t2.image, t2.taste, t2.description, t1.nicotine, t1.price, t1.amont" +
                " from postgres.public.liquids_x_shop as t1 " +
                "inner join postgres.public.liquid as t2 on (t1.liquid_id = t2.id)" +
                "where t1.shop_id ="+shopid+" and t1.liquid_id ="+id , LiquidInShop.class).getSingleResult();
    }
}

Вот моделька:

package DBLayout;
import javax.persistence.*;
@Entity
@Table(name = "shops", schema = "public", catalog = "postgres")
public class ShopsEntity {
    private int id;
    private String label;
    private String image;
    private boolean maildeliverly;
    private boolean courier;
    private int orderminprice;
    private String description;
    @Id
    @Column(name = "id", nullable = false)
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Basic
    @Column(name = "label", nullable = false, length = 100)
    public String getLabel() {
        return label;
    }
    public void setLabel(String label) {
        this.label = label;
    }
    @Basic
    @Column(name = "image", nullable = false, length = 300)
    public String getImage() {
        return image;
    }
    public void setImage(String image) {
        this.image = image;
    }
    @Basic
    @Column(name = "maildeliverly", nullable = false)
    public boolean isMaildeliverly() {
        return maildeliverly;
    }
    public void setMaildeliverly(boolean maildeliverly) {
        this.maildeliverly = maildeliverly;
    }
    @Basic
    @Column(name = "courier", nullable = false)
    public boolean isCourier() {
        return courier;
    }
    public void setCourier(boolean courier) {
        this.courier = courier;
    }
    @Basic
    @Column(name = "orderminprice", nullable = false)
    public int getOrderminprice() {
        return orderminprice;
    }
    public void setOrderminprice(int orderminprice) {
        this.orderminprice = orderminprice;
    }
    @Basic
    @Column(name = "description", nullable = true, length = 300)
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ShopsEntity that = (ShopsEntity) o;
        if (id != that.id) return false;
        if (maildeliverly != that.maildeliverly) return false;
        if (courier != that.courier) return false;
        if (orderminprice != that.orderminprice) return false;
        if (label != null ? !label.equals(that.label) : that.label != null) return false;
        if (image != null ? !image.equals(that.image) : that.image != null) return false;
        if (description != null ? !description.equals(that.description) : that.description != null) return false;
        return true;
    }
    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (label != null ? label.hashCode() : 0);
        result = 31 * result + (image != null ? image.hashCode() : 0);
        result = 31 * result + (maildeliverly ? 1 : 0);
        result = 31 * result + (courier ? 1 : 0);
        result = 31 * result + orderminprice;
        result = 31 * result + (description != null ? description.hashCode() : 0);
        return result;
    }
}

Собственно, когда дергаем getAllShop() со слоя бд, падаю в HibernateUtil, когда пытаюсь создать SessionFactory. Где я свернул не туда?

Answer 1

Похоже, что вы дважды добавляете те же самые классы сущностей в SessionFactory. Один раз вы указываете в hibernate.cfg.xml:

    <mapping class="DBLayout.LiquidEntity"/>
    <mapping class="DBLayout.LiquidsXShopEntity"/>
    <mapping class="DBLayout.ShopsEntity"/>
    <mapping class="DataModel.LiquidInShop"/>
    <mapping class="DataModel.Shop"/>
    <mapping class="DataModel.Liquid"/>

а другой раз

    configuration.addAnnotatedClass(LiquidEntity.class);
    configuration.addAnnotatedClass(ShopsEntity.class);
    configuration.addAnnotatedClass(LiquidsXShopEntity.class);
    configuration.addAnnotatedClass(LiquidInShop.class);
    configuration.addAnnotatedClass(Liquid.class);

выберите, что-то одно.

Используйте hibernate.* свойства фабрики сессии

   <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgres</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL94Dialect</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">od3FQGcT</property>
    <property name="show_sql">false</property>
READ ALSO
Не могу отправить json с Android к java server

Не могу отправить json с Android к java server

Всем приветУ меня есть некоторые проблемы с коннектом

191
Почему Intellij IDEA не находит ConnectionManager?

Почему Intellij IDEA не находит ConnectionManager?

intellij idea не предлагает мне достать из пакета Util > ConnectionManager, чтобы потом преобразовать в

166
Firebase database не принимает данные

Firebase database не принимает данные

Проверьте: - в консоли Firebase - DataBase что вы работаете с Realtime Database, а не Cloud Databese; - проверьте в Realtime Database правила чтения и записи, что бы без ограничений...

172