Я использую этот код для настройки Spring с Hibernate:
@SpringBootApplication
@Configuration
@EnableTransactionManagement
public class ContextServer {
@Bean
public LocalSessionFactoryBean getSessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
try {
sessionFactory.setDataSource(dataSource());
} catch (NamingException e) {
e.printStackTrace();
}
sessionFactory.setPackagesToScan(new String[] { "org.plugin.database.models" });
sessionFactory.setHibernateProperties(hibernateProperties());
// factoryBean.setAnnotatedClasses(User.class, Authorities.class);
return sessionFactory;
}
@Bean
public DataSource dataSource() throws NamingException {
return (DataSource) new JndiTemplate().lookup("java:/global/production_gateway");
}
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;
}
@Bean
public HibernateTransactionManager getTransactionManager() {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(getSessionFactory().getObject());
return transactionManager;
}
}
Я использую фабрику следующим образом:
@Component("authorize")
@Transactional
public class AuthorizeService implements MessageProcessor {
@Autowired
SessionFactory sessionFactory;
@Override
public void processMessage(.....) {
Session session = sessionFactory.getCurrentSession();
}
Но я получаю исключение:
java.lang.ClassCastException:
org.springframework.orm.jpa.EntityManagerHolder cannot be cast to
org.springframework.orm.hibernate5.SessionHolder
Я нашел эти ответы: ClassCastException: org.springframework.orm.jpa .EntityManagerHolder нельзя преобразовать в org.springframework.orm.hibernate5.SessionHolder
Есть ли другое решение, которое я могу использовать? Вышеупомянутые решения - это быстрые взломы.
SessionFactory
.. Зачем вам это вообще нужно? - person M. Deinum   schedule 12.07.2018Session
, используйтеEntityManager
, чтобы получить его, используяEntityManager.unwrap(Session.class)
. - person M. Deinum   schedule 12.07.2018Sessionfactory
расширяетEntitymanagerFactory
и приводит к тому, что Spring 5 думает, что использует JPA. Это будет исправлено в Spring 5.1, но решения для 5.0 нет. Как уже говорилось, я очень сомневаюсь, что вам нужен простой спящий режим для вашего варианта использования. Я подозреваю, что у вас одинаково хорошо получается использовать настроенный по умолчаниюEntityManagerFactory
с Spring Boot (кстати, в учебнике не используется Spring Boot, что также меняет ситуацию!) И просто используйтеEntityManager
для выполнения тех же запросов. - person M. Deinum   schedule 12.07.2018EntityManager
? Можете ли вы сослаться на какой-нибудь учебник? - person Peter Penzov   schedule 12.07.2018@Autowired SessionFactory
используйте@PersistenceContext EntityManager entityManager
(что примерно эквивалентноSession
). Кроме того, ваша конфигурация по-прежнему не использует Spring Boot (по крайней мере, кажется, что нет методаmain
для загрузки вашего приложения). - person M. Deinum   schedule 12.07.2018WebApplicationInitializer
, а специализированную версию Spring Boot, если вы этого не сделаете, вы не используете Spring Boot (что приведет ко всевозможным странностям, если вы действительно ожидаете, что это произойдет, и также для людей, отвечающих на ваши вопросы, поскольку на самом деле вы не используете Spring Boot). - person M. Deinum   schedule 12.07.2018