Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required in spring+hibernate

I am doing spring + hibernate apllication. When I run the application on tomcat server I am getting some exception. Below is my code.

This is my bean config file.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

 <bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>WEB-INF/database/db.properties</value>
    </property>
</bean>
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

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

        <property name="dataSource">
            <ref bean="dataSource" />
        </property> 
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
        <property name="mappingResources">
            <list>
                <value>Employee.hbm.xml</value>
            </list>
        </property>
    </bean>
    <bean id="employeeBo" class="com.saggezza.employee.bo.impl.EmployeeBoImpl">
        <property name="employeeDao" ref="employeeDao" />
    </bean>

    <bean id="employeeDao" class="com.saggezza.employee.dao.impl.EmployeeDaoImpl">
        <constructor-arg ref="sessionFactory"></constructor-arg>
    </bean>

this is my dao class.

public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao {

    private SessionFactory sessionFactory;
    public EmployeeDaoImpl(SessionFactory sessionfactory){
        this.sessionFactory=sessionfactory;
    }

    @Override
    public List<Employee> getEmployeeDetails() {
        return getHibernateTemplate().find("from Employee");

    }
}

Here another class employeeBo is calling the employeeDaoImpl. when I run thisI am getting the below exception.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeBo' defined in ServletContext resource [/WEB-INF/spring/EmployeeBean.xml]: Cannot resolve reference to bean 'employeeDao' while setting bean property 'employeeDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeDao' defined in ServletContext resource [/WEB-INF/spring/EmployeeBean.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required

Can anybody help to resolve this. I have tried a lot and google it as well.But did get the solution.

like image 986
cherry Avatar asked Feb 23 '13 20:02

cherry


1 Answers

If you have two configuration files, you duplicates 'sessionFactory' definition. Remove one of the 'sessionFactory' definitions . You would have got duplicate bean definition exception before the IllegalArgumentException.

Edit: After your comment,

public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao {


public EmployeeDaoImpl(SessionFactory sessionfactory){
    setSessionFactory(sessionfactory);
}

@Override
public List<Employee> getEmployeeDetails() {
    return getHibernateTemplate().find("from Employee");

}
}

or get rid of constructor in above code and inject 'sessionFactory' using setter injection.See org.springframework.orm.hibernate3.support.HibernateDaoSupport.setSessionFactory(SessionFactory). I prefer later approach.

like image 95
Adisesha Avatar answered Oct 09 '22 11:10

Adisesha