2015-02-05 3 views
2

Я делаю hibernate, весенний пример с использованием java-конфигураций. Мой файл конфигурации:как весна autowired sessionFactory объект, даже если нет экземпляра sessionFactory присутствует

@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; 
    } 

Работает отлично. Нет проблем с этим, но когда я вручную попытаться установить SessionFactory параметр для trasactionManager, как показано ниже ..

@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, даже если в первом подходе нет экземпляра sessionFactory?

Просьба уточнить ..

+0

'LocalSessionFactoryBean' не является' SessionFactory', это 'FactoryBean' для' SessionFactory', см. [Javadoc] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework /orm/hibernate4/LocalSessionFactoryBean.html) –

+0

Да, я пропустил этот момент. Спасибо – kasinavijay

+0

Но как весна autwires SessionFactory bean to transactionManager contructor? – kasinavijay

ответ

1

Вы должны изменить типы метод возврата к:

  • SessionFactory
  • PlatformTransactionManager

Это как это должно выглядеть следующим образом:

@Bean 
@Autowired 
public PlatformTransactionManager 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(); 
} 
+0

Почему PlatformTransactionManager вместо HibernateTransactionManager? – kasinavijay

+0

Поскольку возврат интерфейса делает ваш код конфигурации более гибким. –

+0

Теперь im get 'Тип несоответствия: невозможно преобразовать из LocalSessionFactoryBean в SessionFactory' ошибка. – kasinavijay