Фабрика сеансов гибернации всегда равна нулю

Я хочу использовать этот код в приложении Spring и Hibernate с помощью JNDI.

@Configuration
@EnableTransactionManagement
public class ContextDatasource {

    @Bean
    public LocalSessionFactoryBean getSessionFactory() throws NamingException {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[] { "org.plugin.database.models" });
        sessionFactory.setHibernateProperties(hibernateProperties());

        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() throws NamingException {
        return (DataSource) new JndiTemplate().lookup("java:/global/production_gateway");
    }

    @Bean
    public PlatformTransactionManager getHibernateTransactionManager() throws NamingException {
        final HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(getSessionFactory().getObject());
        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor getExceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    @Bean
    public HibernateTransactionManager getTransactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        try {
            transactionManager.setSessionFactory(getSessionFactory().getObject());
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return transactionManager;
    }

    private final Properties hibernateProperties() {
        final Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
        hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MariaDBDialect");

        hibernateProperties.setProperty("hibernate.show_sql", "true");
        hibernateProperties.setProperty("hibernate.format_sql", "true");
        return hibernateProperties;
    }
}

Когда я пытаюсь использовать:

@Autowired
SessionFactory sessionFactory;
..
session = sessionFactory.getCurrentSession();

Фабрика сеансов всегда имеет значение null. Мне не хватает какой-то важной конфигурации. Во время развертывания пакета я не получаю сообщений об ошибках:

20:15:37,217 INFO  [org.hibernate.Version] (ServerService Thread Pool -- 178) HHH000412: Hibernate Core {5.3.1.Final}
20:15:37,219 INFO  [org.hibernate.cfg.Environment] (ServerService Thread Pool -- 178) HHH000206: hibernate.properties not found
20:15:37,302 INFO  [org.hibernate.annotations.common.Version] (ServerService Thread Pool -- 178) HCANN000001: Hibernate Commons Annotations {5.0.3.Final}
20:15:37,404 INFO  [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 178) HHH000400: Using dialect: org.hibernate.dialect.MariaDBDialect
20:15:37,599 INFO  [org.hibernate.orm.beans] (ServerService Thread Pool -- 178) HHH10005002: No explicit CDI BeanManager reference was passed to Hibernate, but CDI is available on the Hibernate ClassLoader.
20:15:38,186 INFO  [stdout] (ServerService Thread Pool -- 178) Hibernate: 

Можете ли вы дать мне совет, что мне не хватает?

какая упаковка у ваших MainApplication и ContextDatasource? SpringBootApplication по умолчанию выполняет сканирование компонентов всех подпакетов.

Dirk Deyne 08.07.2018 20:22

Почему у вас 2 менеджера транзакций? Также поле @Autowired не может быть null, если поле @Autowired не может быть удовлетворено, ваше приложение даже не запустится. Следовательно, вы, вероятно, создаете экземпляр bean-компонента, которому требуется фабрика сеанса за пределами Spring.

M. Deinum 08.07.2018 20:22

Это мой метод запуска Spring: pastebin.com/jhhqbG1N

Peter Penzov 08.07.2018 20:31

@ M.Deinum Какой диспетчер транзакций мне следует удалить?

Peter Penzov 08.07.2018 20:32

Либо один. Также вы заявляете, что используете Spring Boot, но ни один из ваших кодов не показывает использования Spring Boot (если только вы не очень сильно пытаетесь избежать использования Spring Boot в приложении для весенней загрузки).

M. Deinum 08.07.2018 20:35

Страница WAR будет использоваться в качестве сервера API. Если это не обязательно, могу ли я использовать @EnableWebMvc?

Peter Penzov 08.07.2018 20:37
0
6
27
0

Другие вопросы по теме