2013-08-02 118 views
6

我正在尝试将spring3.2.x + hibernate4.x安装程序从xml移至java配置。
继承人的现有代码的一个片段:Hibernate SessionFactory与Spring LocalSessionFactoryBean

import org.hibernate.SessionFactory; 
import org.hibernate.Query; 
import org.hibernate.Session; 

public class StockDaoImpl implements StockDao{ 

    private SessionFactory sessionFactory; 
    public SessionFactory getSessionFactory() { 
     return sessionFactory;} 
    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    public void save(Stock stock){ 
     Session session = getSessionFactory().openSession(); 
     try{ 
     session.save(stock); 
     } 
     finally{ 
     session.close(); 
     } 
    } 

Spring配置文件

<!-- Stock Data Access Object --> 
    <bean id="stockDao" class="com.data.dao.StockDaoImpl" > 
     <property name="sessionFactory" ref="sessionFactory"></property> 
    </bean> 

    <bean id="dataSource"> 
..... 
</bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 

     <property name="dataSource"> 
      <ref bean="dataSource"/> 
     </property> 
     <property name="hibernateProperties"> 
      ...... 
     </property> 
     <property name="mappingResources"> 
     ....... 
     </property> 
    </bean> 

这工作得很好 - 但我如何在Java中重新定义这个配置?
这里有一个尝试 -

@Bean 
    public StockDao stockDao() { 
     StockDaoImpl dao=new StockDaoImpl(); 
     dao.setSessionFactory(sessionFactory()); 
     return dao; 
    } 

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

     return sessionFactory; 
    } 

但是这不会编译为sessionFacotry被称为是不是春天的LocalSessionFactoryBean的?
我该如何协调?

+0

注释这不会编译:什么是确切的和完整的编译错误?为什么不使用自动装配和类路径扫描而不是直接定义你的DAO? –

+0

COM \数据\配置\ PersistenceConfig.java:32:的setSessionFactory(org.hibernate.Sessi onFactory)在com.data.dao.StockDaoImpl不能被应用到(org.springframewor k.orm.hibernate4.LocalSessionFactoryBean) 道.setSessionFactory(SessionFactory的()); – IUnknown

回答

9

LocalSessionFactoryBean是FactoryBean<SessionFactory>。这意味着它允许创建SessionFactory的实例。

所以,你只需要

public StockDao stockDao() { 
    StockDaoImpl dao=new StockDaoImpl(); 
    dao.setSessionFactory(sessionFactory().getObject()); 
    return dao; 
} 

但我不会创建的DAO explicitel这样。只需使用@Repository注释您的DAO,并使用@Autowired自动装载会话工厂。确保Java配置类用@ComponentScan("the.base.package.of.daos")

0

作为回报缺少getObject()调用。
代替return sessionFactory.getObject()(并且变更返回类型!)

相关问题