I have some hbm.xml files in classpath resource located in src/main/resources maven\'s folder. I used spring\'s LocalSessionFactoryBean to load these files with the followin
This looks quite okay to me. Hence I don't think the problem is the config. I rather think the files simply aren't on the classpath. How did you start your application?
If you're using eclipse, make sure src/main/resources is used as source folder and resources are copied to target/classes.
@Autowired
private ResourceLoader rl;
@Bean
public LocalSessionFactoryBean sessionFactory() throws IOException {
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setMappingLocations(loadResources());
}
public Resource[] loadResources() {
Resource[] resources = null;
try {
resources = ResourcePatternUtils.getResourcePatternResolver(rl)
.getResources("classpath:/hibernate/*.hbm.xml");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return resources;
}
If you are loading your Spring application context from a webapp, you might see an error like this:
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.io.FileNotFoundException: ServletContext resource [/hibernate.cfg.xml] cannot be resolved to URL because it does not exist
The solution is to explicitly tell Spring to load the configuration from the classpath like so:
classpath:mypath/myfile.xml
Files located in src/main/resources
end up in WEB-INF/classes
when using Maven with a project of type war
(and the resources
directory structure is preserved). So either place your mapping files in src/main/resources/mapping
or use the following configuration:
<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSourceOracle"/>
<property name="mappingResources">
<list>
<value>SystemUser.hbm.xml</value>
<value>SystemCredential.hbm.xml</value>
<value>SystemProvince.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
</value>
</property>
</bean>
In web applications, when you write a resource path without prefix, Spring loads it from a context root (i.e., from a folder containing WEB-INF). To load resources from a classpath you should use "classpath:" prefix:
<value>classpath:mapping/SystemUser.hbm.xml</value>