Spring整合Hibernate时遇到BeanCreationException

来源:互联网 发布:java 线程挂起和唤醒 编辑:程序博客网 时间:2024/06/05 15:39

初学Spring,在Spring中整合Hibernate时,遇到如下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'BookDAO' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: sessionFactory or hibernateTemplate is required

我在程序中定义了一个BookDAO类,继承了HibernateDaoSupport,以利用HibernateTemplate来进行对数据库数据的增删修查的操作。

 

public class BookDAO extends HibernateDaoSupport ...{
    
    
public void addBook(Book book)...{
         getHibernateTemplate().save(book);
         getHibernateTemplate().flush();
     }

    
    
public void delBook(Book book)...{
         getHibernateTemplate().delete(book);
         getHibernateTemplate().flush();
     }

    
    
public void update(Book book)...{
         getHibernateTemplate().update(book);
         getHibernateTemplate().flush();
     }

    
    
public Book getBook(long oid)...{
        
return (Book)getHibernateTemplate().get(Book.class, oid);
        
     }

    
}

另外,我定义了一个类BookSrv,其依赖于BookDAO,并利用Setter Injection的依赖注入方式,注入BookDAO的对象。

 

public class BookSrv ...{
    
    
private BookDAO bdao=null;

    
public void setBdao(BookDAO bdao) ...{
        
this.bdao = bdao;
     }

    
    
public void add(Book book)...{
         bdao.addBook(book);
     }

    
    
public void del(Book book)...{
         bdao.delBook(book);
     }

    
    
public void update(Book book)...{
         bdao.update(book);
     }

    
public Book get(long oid)...{
        
return bdao.getBook(oid);
     }

}

我原先的错误的配置文件如下(省略其他部分):

 

<bean id="BookDAO" class="dao.BookDAO">
</bean>
    
<bean id="BookSrv" class="srv.BookSrv">
           
<property name="bdao" ref="BookDAO"></property>
</bean>

 

想了很久,也找不出异常地原因。而且被那一句sessionFactory or hibernateTemplate is required所害,一直在dataSource、sessionFactory、hibernateTemplate的配置上苦苦地追寻着错误所在。

其实早该发现问题地所在:BeanCreationException: Error creating bean with name 'BookDAO' ……

因为BookDAO继承了HibernateDaoSupport,并利用HibernateDaoSupport的getHibernateTemplate()得到一个HibernateTemplate的对象,然后再调用这个对象的save()、flush()等方法。所以,BookDAO依赖于HibernateTemplate。

于是,在配置文件中加上BookDAO对HibernateTemplate的依赖即可解决问题。

正确的配置文件为:

 

    <bean id="BookDAO" class="dao.BookDAO">
        
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
    
</bean>
    
    
<bean id="BookSrv" class="srv.BookSrv">
        
<property name="bdao" ref="BookDAO"></property>
    
</bean>
原创粉丝点击