【问题标题】:Access SessionFactory from Spring Boot Application从 Spring Boot 应用程序访问 SessionFactory
【发布时间】:2015-05-27 09:05:13
【问题描述】:

我正在尝试访问 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();
          //        }
    }

    ...

}

知道为什么吗?

【问题讨论】:

  • JPA 不使用 CurrentSessionContext 类。配置它应该可以解决您的问题。只需添加当前会话上下文的配置并让它指向org.springframework.orm.hibernate4.SpringSessionContext 类。但是,您为什么要这样做?为什么不使用普通的 JPA?
  • @M.Deinum 我这样做是为了支持一些使用 Hibernate Criteria 的遗留代码。它最终将转换为 JPA。应用程序的其余部分使用 spring-data-jpa,我只需要临时使用 Hibernate SessionFactory,直到它可以重写。像这样的混合方法会奏效吗?你能举一个在java config中将CurrentSessionContext配置为spring bean的例子吗?
  • this 是什么意思?
  • 是的(因为这基本上是同一个问题,所以将这个问题标记为重复)。
  • stackoverflow.com/questions/18759978/…。请参考这里。向您展示如何做到这一点。

标签: spring hibernate spring-boot


【解决方案1】:

在属性文件中,

spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

在配置类中

@Bean
public HibernateJpaSessionFactoryBean sessionFactory() {
    return new HibernateJpaSessionFactoryBean();
}

然后你就可以自动接线了

@Autowired
private SessionFactory sessionFactory;

我们这样做是因为 Spring boot 不会自动配置 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 的示例。

【讨论】:

  • 现在已弃用。
【解决方案2】:

您可以使用 entityManagerFactory unwrap 方法而不是 HibernateJpaSessionFactoryBean 来访问 SessionFactory

SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

HibernateJpaSessionFactoryBean 在 Spring Boot 1.5.8 中已弃用

【讨论】:

    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2019-03-04
    • 2021-01-26
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多