【发布时间】:2018-12-20 00:20:46
【问题描述】:
我正在使用这段代码来配置带有 Hibernate 的 Spring:
@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
还有其他我可以使用的解决方案吗?以上解决方案是快速破解。
【问题讨论】:
-
要么将hibernate降级到SessionFactory..你为什么还需要它?
-
@M.Deinum 我从教程中拿了这个例子。如果我删除会话工厂,我如何进行 Hibernate 查询?有没有示例项目?
-
为什么需要休眠查询。使用 JPA 查询。 Hibernate 是一个 JPA 实现,从它开始。如果你真的需要休眠,你总是可以获取底层会话,但首先从 JPA 开始,而不是简单的休眠。如果你真的想要
Session使用EntityManager来获得它,使用EntityManager.unwrap(Session.class)。 -
你能在这里粘贴示例代码作为官方答案吗?
标签: spring hibernate spring-boot hibernate-search hibernate-ogm