NullPointerException при получении спящего режима - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь интегрировать Hibernate 5.2.12 в мое приложение Spring, но получаю исключение nullPointerException при получении сеанса.

Вот конфигурация Hibernate

@Configuration
@EnableTransactionManagement
public class HibernateConfig {

@Bean
public LocalSessionFactoryBean sessionFactory() {
    System.out.println("Session factory called!");
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan(
            "com.app.persistence.model");
    sessionFactory.setHibernateProperties(hibernateProperties());

    return sessionFactory;
}

@Bean
public DataSource dataSource() {

    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/appDatabase?useSSL=false");
    dataSource.setUsername("root");
    dataSource.setPassword("password");

    return dataSource;
}

@Bean
public PlatformTransactionManager hibernateTransactionManager() {
    HibernateTransactionManager transactionManager
            = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory().getObject());

    return transactionManager;
}

private final Properties hibernateProperties() {
    Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty(
            "hibernate.hbm2ddl.auto", "");
    hibernateProperties.setProperty(
            "hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");

    return hibernateProperties;
}

}

Вот мой класс утилит, где sessionFactory - @ AutoWired

public class AppHibernateUtil {

private static final AppHibernateUtil instance = new AppHibernateUtil();

@Autowired
private SessionFactory sessionFactory;

public static Session getSession() {

    return getInstance().sessionFactory.openSession();
}

private static AppHibernateUtil getInstance() {
    return instance;
}

}

Вот моя попытка использования сеанса

public static String getRoles() {

    System.out.println("Custom: getRoles() called");

    List<RoleEntity> roles = new ArrayList<>();

    try(Session session = AppHibernateUtil.getSession()){

        roles = session.createQuery("from RoleEntity").list();
    }

    return gson.toJson(roles.size());
}

public static void main(String args[]) {
    System.out.println(getRoles());
}

Пустое исключениеброшено сюда

return getInstance().sessionFactory.openSession();

Эта строка никогда не выводится на консоль

System.out.println("Session factory called!");

Если я игнорирую класс AppHibernateUtil, создавая тестовый класс, который внедряет (или нет) сессию sessionFactory.Я получаю тот же NPE

@Component
public class TestController {

private static Gson gson = new Gson();

@Autowired
private static SessionFactory sessionFactory;

public static String getRoles() {

    System.out.println("Custom: getRoles() called");

    List<RoleEntity> roles = new ArrayList<>();

    try(Session session = sessionFactory.getCurrentSession()){

        roles = session.createQuery("from RoleEntity").list();
    }

    return gson.toJson(roles.size());
}

public static void main(String args[]) {
    System.out.println(getRoles());
}
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я предполагаю, что NPE выбрасывается, потому что sessionFactory в методе getSession() является нулевым.

Это означает, что Spring не вводит экземпляр SessionFactory.

Это может быть потому, что вы решили реализовать AppHibernateUtil в качестве одиночного.Я не стану обсуждать это, за исключением того, что уместно указать, что Spring основан на внедрении зависимостей, и использование синглетонов идет вразрез с этим подходом.

Если вы хотите продолжать использовать синглтон, вы можетедобиться успеха с дополнительными аннотациями для класса AppHibernateUtil:

@Configuration
@ComponentScan("com.your.package.HibernateConfig")
public class AppHibernateUtil {
...
}

Однако, как описано в документах , вероятно, было бы лучше провести рефакторинг класса AppHibernateUtil, чтобы онне был синглтоном:

@Configuration
public class AppHibernateUtil {
    private final AppConfig appConfig;

    public AppHibernateUtil(AppConfig appConfig) {
         this.appConfig = appConfig;
     }
}
0 голосов
/ 14 февраля 2019

Проблема не в вашей конфигурации гибернации, а в внедрении зависимостей.

Вы вручную создаете синглтон AppHibernateUtil (вы вызываете new AppHibernateUtil()), позволяете Spring выполнять свою работу и комментируете AppHibernateUtil с помощью @Component (область действия компонента по умолчанию - Singleton), затем внедрите его в свой класс, где требуется ваш сеанс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...