Spring + Hibernate Session Factory:在JAR中映射文件目录

时间:2011-11-23 11:03:15

标签: hibernate spring jar hibernate-mapping applicationcontext

我有基于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项目。但是,一旦我创建了一个war并将其部署到Tomcat,它就无法获得类路径资源。

Spring的ClasspathResource javadoc意味着:“如果类路径资源驻留在文件系统中,则支持解析为java.io.File,而不支持JAR中的资源。始终支持解析为URL。

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

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

2 个答案:

答案 0 :(得分:1)

这有效

//所有应用程序上下文都实现了ResourcePatternResolver

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

编辑:用ResourcePatternResolver替换DefaultResourceLoader。

答案 1 :(得分:0)

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

我只是告诉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访问(如问题示例中所示)。