Я хочу использовать этот код в приложении 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:
Можете ли вы дать мне совет, что мне не хватает?
Почему у вас 2 менеджера транзакций? Также поле @Autowired не может быть null, если поле @Autowired не может быть удовлетворено, ваше приложение даже не запустится. Следовательно, вы, вероятно, создаете экземпляр bean-компонента, которому требуется фабрика сеанса за пределами Spring.
Это мой метод запуска Spring: pastebin.com/jhhqbG1N
@ M.Deinum Какой диспетчер транзакций мне следует удалить?
Либо один. Также вы заявляете, что используете Spring Boot, но ни один из ваших кодов не показывает использования Spring Boot (если только вы не очень сильно пытаетесь избежать использования Spring Boot в приложении для весенней загрузки).
Страница WAR будет использоваться в качестве сервера API. Если это не обязательно, могу ли я использовать @EnableWebMvc?
какая упаковка у ваших
MainApplicationиContextDatasource?SpringBootApplicationпо умолчанию выполняет сканирование компонентов всех подпакетов.