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

前端 未结 4 382
暗喜
暗喜 2021-01-18 00:11

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.

相关标签:
4条回答
  • 2021-01-18 00:51

    This is an old question so must be solved now but still if someone comes across this problem. Following is solution.

    You can use Hibernate DAO Support by extending HibernateDAOSupport class and overriding its afterPropertiesSet() method.

    This method is called in HibernateDAO support and at that time since sessionFactory is null it is throwing this error. In your custom class you can set this property explicitly and then call the same method of Parent Class (i.e. HibernateDAOSupport's addProperties() method)

    package com.techcielo.spring4.hibernate.template;
    
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.orm.hibernate3.HibernateTemplate;
    import org.springframework.stereotype.Component;
    
    @Component("hibernateTemplate")
    public class Hibernate4CustomTemplate extends HibernateTemplate{
    
        @Autowired(required=true)
        private SessionFactory sessionFactory;
        public void setSessionFactory(SessionFactory sessionFactory) {
            System.out.println("Setting SessionFactory");
            this.sessionFactory = sessionFactory;
            super.setSessionFactory(sessionFactory);
        }
    
        @Override
        public void afterPropertiesSet() {
        System.out.println("Checking if properties set..."+this.sessionFactory);
        setSessionFactory(sessionFactory);
        super.afterPropertiesSet();
        }
    }
    

    Following can be used for sample!

    0 讨论(0)
  • 2021-01-18 00:55

    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.

    0 讨论(0)
  • 2021-01-18 01:03

    I think the problem is the type of SessionFactory you are injecting in EmployeeDaoImpl does not match with the type of the SessionFactory you used in the class.

    Can you check it?

    0 讨论(0)
  • 2021-01-18 01:09

    I had the same problem and fix it by using Autowired constructor with EntityManagerFactory. Keyur answer is correct

    @Service
    class EmployeeDaoImpl @Autowired constructor(
            factory: EntityManagerFactory
    ) : HibernateDaoSupport(), EmployeeDao {
    
        init {
            if (factory.unwrap(SessionFactory::class.java) == null) {
                throw NullPointerException("factory is not a hibernate factory")
            }
            setSessionFactory(factory.unwrap(SessionFactory::class.java))
        }
        ...
    
    }
    
    0 讨论(0)
提交回复
热议问题