从 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.2above 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

中已弃用