Hibernate4 configuration without xml files - sessionFactory is null
hibernate, java
Solution
Try adding this line
localSessionFactoryBean.afterPropertiesSet();
in the method after the properties of `LocalSessionFactoryInstance` has been set. Your method will be as
private static LocalSessionFactoryBean generateSessionFactoryBean(String[] basePackage, DataSource dataSource,
Properties hibernateProperties) {
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource);
localSessionFactoryBean.setPackagesToScan(basePackage);
localSessionFactoryBean.setHibernateProperties(hibernateProperties);
// Added the below line
localSessionFactoryBean.afterPropertiesSet();
return localSessionFactoryBean;
}
This link may add more insight to the problem.
As per Documentation,
public void afterPropertiesSet() throws IOException
Invoked by a BeanFactory after it has set all bean properties supplied (and satisfied BeanFactoryAware and ApplicationContextAware). This method allows the bean instance to perform initialization only possible when all bean properties have been set and to throw an exception in the event of misconfiguration.
In your case, I think you need to call it in your code manually.
Problem
I have a web project working with Spring3 and Hibernate4 and now I want to test the DAOs without using the xml files. To do so I have created a class that creates a LocalSessionFactoryBean with the data contained in the application's xml file and a simple test class. However, the sessionFactory returned by localSessionFactoryBean.getObject() is null. I have been looking at some examples like this and they have the same problem when I modify them to run without Spring. Do you have any idea? This is the code that prepares the sessionFactory: ``` @Configuration @Transactional @EnableTransactionManagement @ComponentScan({ "com.company" }) public class HibernateInitializator { public SessionFactory getSessionFactory() { Properties hibernateProperties = getHibernateProperties(); DataSource dataSource = getDatasourceConfiguration(); LocalSessionFactoryBean localSessionFactoryBean = generateSessionFactoryBean(new String[] { "com.company" }, dataSource, hibernateProperties); SessionFactory sessionFactory = localSessionFactoryBean.getObject(); HibernateTransactionManager txManager = new HibernateTransactionManager(); txManager.setSessionFactory(sessionFactory); return sessionFactory; } private DataSource getDatasourceConfiguration() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/dbName"); dataSource.setUsername("username"); dataSource.setPassword("password"); return dataSource; } private static LocalSessionFactoryBean generateSessionFactoryBean(String[] basePackage, DataSource dataSource, Properties hibernateProperties) { LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean(); localSessionFactoryBean.setDataSource(dataSource); localSessionFactoryBean.setPackagesToScan(basePackage); localSessionFactoryBean.setHibernateProperties(hibernateProperties); return localSessionFactoryBean; } private static Properties getHibernateProperties() { Properties hibernateProperties = new Properties(); hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect"); hibernateProperties.put("hibernate.show_sql", false); hibernateProperties.put("hibernate.generate_statistics", false); hibernateProperties.put("hibernate.hbm2ddl.auto", "update"); hibernateProperties.put("hibernate.use_sql_comments", false); return hibernateProperties; } } ``` And this is a simple test class that uses it: ``` public class GenericDAOHibernateTest { private GenericDAOHibernate dao; @BeforeTest private void testInitialization() { dao = new GenericDAO(); HibernateInitializator initializator = new HibernateInitializator(); SessionFactory sessionFactory = initializator.getSessionFactory(); dao.setSessionFactory(sessionFactory); } @Test(description = "Checks that returns the user list ") public void shouldReturnsUserList() throws SQLException, Exception { List<Object[]> openResultSetList = dao.doSomeOperation(); ... } } ```