从 Spring 引导应用程序访问 SessionFactory
Access SessionFactory from Spring Boot Application
我正在尝试访问 Hibernate 会话工厂,但在提到的行出现以下错误。
No CurrentSessionContext configured!
代码
@Service
@Transactional
public class GenericSearchImpl implements GenericSearch {
@Autowired
private EntityManagerFactory entityManagerFactory;
@Override
@SuppressWarnings("unchecked")
public <T> List<T> search(final Class<T> type, final String[] criteriaList, final int page, final int perPage) {
Session session = getSession();
...
}
public Session getSession() {
final HibernateEntityManagerFactory emFactory = (HibernateEntityManagerFactory) entityManagerFactory;
final SessionFactory sessionFactory = emFactory.getSessionFactory();
return sessionFactory.getCurrentSession(); //ERROR No CurrentSessionContext configured!
//This worked but I understand it to be BAD as spring should be managing open sessions.
// try {
// return sessionFactory.getCurrentSession();
// } catch (Exception e) {
// return sessionFactory.openSession();
// }
}
...
}
知道为什么吗?
在属性文件中,
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
配置中class
@Bean
public HibernateJpaSessionFactoryBean sessionFactory() {
return new HibernateJpaSessionFactoryBean();
}
然后你可以自动装配
@Autowired
private SessionFactory sessionFactory;
我们这样做是因为 Spring 启动不会自动配置 hibernate sessinoFactory。
更新: 从 Spring 4.3.12 和 Hibernate 5.2,above Hibernate API solution is depreciated 支持泛型JPA API 解决方案 EntityManagerFactory。
Session session = entityManager.unwrap(Session.class);
Here 是一些详细的示例文档,其中包含有关 EntityManagerFactory 的示例。
您可以使用 entityManagerFactory unwrap 方法访问 SessionFactory 而不是 HibernateJpaSessionFactoryBean
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
HibernateJpaSessionFactoryBean 在 Spring Boot 1.5.8
中已弃用
我正在尝试访问 Hibernate 会话工厂,但在提到的行出现以下错误。
No CurrentSessionContext configured!
代码
@Service
@Transactional
public class GenericSearchImpl implements GenericSearch {
@Autowired
private EntityManagerFactory entityManagerFactory;
@Override
@SuppressWarnings("unchecked")
public <T> List<T> search(final Class<T> type, final String[] criteriaList, final int page, final int perPage) {
Session session = getSession();
...
}
public Session getSession() {
final HibernateEntityManagerFactory emFactory = (HibernateEntityManagerFactory) entityManagerFactory;
final SessionFactory sessionFactory = emFactory.getSessionFactory();
return sessionFactory.getCurrentSession(); //ERROR No CurrentSessionContext configured!
//This worked but I understand it to be BAD as spring should be managing open sessions.
// try {
// return sessionFactory.getCurrentSession();
// } catch (Exception e) {
// return sessionFactory.openSession();
// }
}
...
}
知道为什么吗?
在属性文件中,
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
配置中class
@Bean
public HibernateJpaSessionFactoryBean sessionFactory() {
return new HibernateJpaSessionFactoryBean();
}
然后你可以自动装配
@Autowired
private SessionFactory sessionFactory;
我们这样做是因为 Spring 启动不会自动配置 hibernate sessinoFactory。
更新: 从 Spring 4.3.12 和 Hibernate 5.2,above Hibernate API solution is depreciated 支持泛型JPA API 解决方案 EntityManagerFactory。
Session session = entityManager.unwrap(Session.class);
Here 是一些详细的示例文档,其中包含有关 EntityManagerFactory 的示例。
您可以使用 entityManagerFactory unwrap 方法访问 SessionFactory 而不是 HibernateJpaSessionFactoryBean
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
HibernateJpaSessionFactoryBean 在 Spring Boot 1.5.8
中已弃用