我有一个使用Spring3和Hibernate4的Web项目,现在我想在不使用xml文件的情况下测试DAO。为此,我创建了一个类,该类使用应用程序的xml文件中包含的数据和一个简单的测试类创建一个LocalSessionFactoryBean。
但是, localSessionFactoryBean.getObject() 返回的 sessionFactory 为null。我一直在寻找像一些例子这和他们有同样的问题,当我修改他们没有Spring运行。你有什么主意吗? __
这是准备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; } }
这是一个使用它的简单测试类:
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(); ... } }
尝试添加此行
localSessionFactoryBean.afterPropertiesSet();
LocalSessionFactoryInstance设置属性后的方法中。您的方法将是
LocalSessionFactoryInstance
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; }
此链接可以为问题提供更多的见解。
根据文档,
public void afterPropertiesSet()引发IOException
在BeanFactory设置了提供的所有bean属性(以及满意的BeanFactoryAware和ApplicationContextAware)之后调用。此方法仅在设置了所有bean属性后才允许bean实例执行初始化,并在配置错误的情况下引发异常。
就您而言,我认为您需要在代码中手动调用它。