spring - 来自classpath资源的hibernate load * .hbm.xml

时间:2009-12-22 17:01:12

标签: java hibernate spring maven-2 orm

我在classpath资源中有一些hbm.xml文件位于src / main / resources maven的文件夹中。我使用spring的LocalSessionFactoryBean使用以下bean配置加载这些文件:

<bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSourceOracle"/>
    <property name="mappingResources">
        <list>
            <value>mapping/SystemUser.hbm.xml</value>
            <value>mapping/SystemCredential.hbm.xml</value>
            <value>mapping/SystemProvince.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
        </value>
    </property>
</bean>

但是它给了我FileNotFoundException。请告诉我我做错了什么 谢谢。

5 个答案:

答案 0 :(得分:4)

当使用带有src/main/resources类型的项目的Maven时,位于WEB-INF/classes的文件最终会显示在war中(并保留resources目录结构)。因此,要么将映射文件放在src/main/resources/mapping中,要么使用以下配置:

<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>

答案 1 :(得分:1)

这看起来对我很好。因此我不认为问题是配置。我宁愿认为文件根本不在类路径上。你是如何开始申请的?

如果您正在使用eclipse,请确保将src / main / resources用作源文件夹,并将资源复制到目标/类。

答案 2 :(得分:1)

@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;
}

答案 3 :(得分:0)

在Web应用程序中,当您编写没有前缀的资源路径时,Spring会从上下文根(即来自包含WEB-INF的文件夹)加载它。要从类路径加载资源,您应该使用“classpath:”前缀:

<value>classpath:mapping/SystemUser.hbm.xml</value>

答案 4 :(得分:0)

如果从Web应用程序加载Spring应用程序上下文,则可能会出现如下错误:

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

解决方案是明确告诉Spring从类路径加载配置,如下所示:

classpath:mypath/myfile.xml