0

我有基于 Hibernate 和 Spring(编程配置)的 web 项目。Hibernate 映射在一个包中提供,该包归档在一个 JAR 中。

在初始化会话工厂时,我曾经调用过:

sessionFactory.
    setMappingDirectoryLocations(new Resource[]{
        new ClassPathResource("org/all/theway/to/hibernatemappings")});

为了告诉 Hibernate 在哪里寻找映射文件。“org/all/theway/to/hibernatemappings”是包含 hbm.xml 文件的包。这在 Eclipse(GWT 开发模式)中运行良好,因为包含映射的项目也被检出并链接到我的 Web 项目。但是,一旦我创建了一个战争并将其部署到 Tomcat,它就无法获取类路径资源。

Spring 的 ClasspathResource javadoc 暗示了这一点:“如果类路径资源驻留在文件系统中,则支持解析为 java.io.File,但不支持 JAR 中的资源。始终支持解析为 URL。

但是该怎么做呢?我也可以改用 setMappingJarLocation,但我不喜欢在 Spring 上下文中硬编码 jar 文件名。此外,当我尝试它时,它也只能在 IDE 中工作,但在 Tomcat 中,相同的文件路径(WEB-INF/lib/file.jar)不起作用。这也让我相信这将是一个丑陋的解决方案。

有没有不使用 jar 文件的解决方法?

4

2 回答 2

1

这有效

//所有应用上下文实现ResourcePatternResolver

ResourcePatternResolver resourcePatternResolver= applicationContext;
sessionFactory.setMappingDirectoryLocations(resourcePatternResolver.getResources("classpath*:org/all/theway/to/hibernatemappings/*.hbm.xml"));

编辑:将 DefaultResourceLoader 替换为 ResourcePatternResolver。

于 2011-11-23T18:26:05.740 回答
0

不是真正解决原始问题,而是避免在配置代码中处理 jar 文件的文件系统文件名的解决方法:

我只是告诉 ant 将有问题的 JAR 解压到 WEB-INF/classes 文件夹中

<target name="unpack.hibernatemappings">
    <unzip dest="${war.dir}/WEB-INF/classes">
        <fileset dir="${lib.dir}">
            <include name="archive-containing-the-hbm-files.jar"/>
        </fileset>
    </unzip>
</target>

现在,Hibernate 映射驻留在文件系统中,并且可以作为 ClassPathResource 访问(就像在问题的示例中一样)。

于 2011-11-24T15:24:05.657 回答