Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate SessionFactory与Spring LocalSessionFactoryBean_Spring_Hibernate - Fatal编程技术网

Hibernate SessionFactory与Spring LocalSessionFactoryBean

Hibernate SessionFactory与Spring LocalSessionFactoryBean,spring,hibernate,Spring,Hibernate,我正在尝试将spring3.2.x+hibernate4.x设置从xml迁移到java配置。 下面是现有代码的一个片段: import org.hibernate.SessionFactory; import org.hibernate.Query; import org.hibernate.Session; public class StockDaoImpl implements StockDao{ private SessionFactory sessionFactory;

我正在尝试将spring3.2.x+hibernate4.x设置从xml迁移到java配置。
下面是现有代码的一个片段:

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>
但是它不会编译,因为所引用的
sessionFactory
不是Spring的LocalSessionFactoryBean

我如何协调这一点

缺少返回的getObject()调用。

return sessionFactory.getObject()
(并更改返回类型!)替换它。

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

所以你只需要

public StockDao stockDao() {
    StockDaoImpl dao=new StockDaoImpl();
    dao.setSessionFactory(sessionFactory().getObject());
    return dao;
}
但我不会像那样创建DAOs明确的电话。只需使用@Repository注释DAO,并使用@Autowired自动连接会话工厂。确保Java配置类用
@ComponentScan(“the.base.package.of.daos”)注释

对我有帮助,但我需要单独声明bean才能工作:

@Bean
public LocalSessionFactoryBean sessionFactoryBean(final DataSource dataSource,
                                              final Properties hibernateProperties,
                                              final List<String> hibernateMappings) {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);
    sessionFactoryBean.setHibernateProperties(hibernateProperties);
    sessionFactoryBean.setMappingResources(hibernateMappings.toArray(new String[hibernateMappings.size()]));
    return sessionFactoryBean;
}

@Bean
public SessionFactory sessionFactory(LocalSessionFactoryBean sessionFactoryBean) {
    return sessionFactoryBean.getObject();
}
@Bean
公共LocalSessionFactoryBean sessionFactoryBean(最终数据源数据源,
最终属性和最终属性,
最终清单(附件){
LocalSessionFactoryBean sessionFactoryBean=新的LocalSessionFactoryBean();
setDataSource(dataSource);
setHibernateProperties(hibernateProperties);
setMappingResources(hibernateMappings.toArray(新字符串[hibernateMappings.size()]);
返回sessionFactoryBean;
}
@豆子
public SessionFactory SessionFactory(LocalSessionFactoryBean sessionFactoryBean){
返回sessionFactoryBean.getObject();
}

这将无法编译:准确完整的编译错误是什么?为什么不使用自动连接和类路径扫描,而不是明确定义DAO?com\data\config\PersistenceConfig.java:32:com.data.DAO.StockDaoImpl中的setSessionFactory(org.hibernate.sessionFactory)不能应用于(org.springframewor k.orm.hibernate4.LocalSessionFactoryBean)DAO.setSessionFactory(sessionFactory());
@Bean
public LocalSessionFactoryBean sessionFactoryBean(final DataSource dataSource,
                                              final Properties hibernateProperties,
                                              final List<String> hibernateMappings) {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);
    sessionFactoryBean.setHibernateProperties(hibernateProperties);
    sessionFactoryBean.setMappingResources(hibernateMappings.toArray(new String[hibernateMappings.size()]));
    return sessionFactoryBean;
}

@Bean
public SessionFactory sessionFactory(LocalSessionFactoryBean sessionFactoryBean) {
    return sessionFactoryBean.getObject();
}