【问题标题】:How Spring @Autowired binds the SessionFactory object even if there is no SessionFactory instance available即使没有可用的 SessionFactory 实例,Spring @Autowired 如何绑定 SessionFactory 对象
【发布时间】:2015-04-04 22:54:00
【问题描述】:

我将 Hibernate 和 Spring 与基于 Java 的配置一起使用。我的配置文件是这个:

@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
   HibernateTransactionManager txManager = new HibernateTransactionManager();
   txManager.setSessionFactory(s);
   return txManager;
}

@Bean
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan(new String[] { "dto" });
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
 }

工作正常。这个没问题,但是当我手动尝试为trasactionManager设置sessionfactory参数时,像这样:

@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
   HibernateTransactionManager txManager = new HibernateTransactionManager();
   txManager.setSessionFactory(sessionFactory());
   return txManager;
}

IDE 正在显示:

`The method setSessionFactory(SessionFactory) in the type HibernateTransactionManager is not applicable for the arguments (LocalSessionFactoryBean)`

所以,我创建了一个如下所示的 sessionFactory

@Bean
@Autowired
public SessionFactory sessionFactory(DataSource dataSource) {
    LocalSessionFactoryBuilder sessionFactory = new LocalSessionFactoryBuilder(dataSource);
    sessionFactory.addProperties(hibernateProperties());
    sessionFactory.scanPackages("dto");
    return sessionFactory.buildSessionFactory();

}

并传递给trasactionManager 成功了。

我的问题是,即使第一种方法中不存在 sessionFactory 实例,spring 如何自动装配 sessionFactory 对象?

【问题讨论】:

  • LocalSessionFactoryBean 不是SessionFactory,它是FactoryBean for SessionFactory,参见javadoc
  • 是的,我错过了这一点。谢谢
  • 但是 spring 如何将 SessionFactory bean 自动连接到 transactionManager 构造函数?
  • 如果你观察到正确的答案并没有解释 spring 如何将 SessionFactory bean 自动连接到 transactionManager 构造函数

标签: java spring hibernate configuration autowired


【解决方案1】:

您需要将方法返回类型从SessionFactory 更改为HibernateTransactionManager

它应该是这样的:

@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
   HibernateTransactionManager txManager = new HibernateTransactionManager();
   txManager.setSessionFactory(s);
   return txManager;
}

@Bean
public SessionFactory sessionFactory() {
    Properties properties = new Properties();
    properties.setProperty("hibernate.show_sql", "true")
    properties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory")
    properties.setProperty("hibernate.cache.use_query_cache", "true")
    properties.setProperty("hibernate.cache.use_second_level_cache", "true")
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect")

    return new LocalSessionFactoryBuilder(dataSource())
        .scanPackages("dto")
        .addProperties(properties)
        .buildSessionFactory();
}

【讨论】:

  • 为什么选择 PlatformTransactionManager 而不是 HibernateTransactionManager ?
  • 现在我收到“类型不匹配:无法从 LocalSessionFactoryBean 转换为 SessionFactory”错误..
  • LocalSessionFactoryBean类型中的方法buildSessionFactory(LocalSessionFactoryBuilder)不适用于参数()
  • usign 'LocalSessionFactoryBuilder' 创建了 sessionFactory。
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 2023-03-22
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多