You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring5+Hibernate5中LocalSessionFactoryBean的mappingDirectoryLocations配置失效问题

解决Weblogic部署Spring+Hibernate时的FileNotFoundException问题

嘿,这个问题我之前在Weblogic上部署Spring应用时也碰到过!本质原因是Weblogic默认不会自动展开WAR包,而你用的mappingDirectoryLocations属性是直接去文件系统找对应的目录——但WAR没展开的话,这个路径其实是在压缩包内部的资源,根本不是文件系统里的真实目录,自然就报找不到文件的错误了。

下面给你几个实用的解决方案:

解决方案1:让Weblogic自动展开WAR包

你可以修改Web应用的weblogic.xml配置文件,强制Weblogic部署时展开WAR包:

<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd">
    <!-- 添加这行配置,开启WAR自动解压 -->
    <unpack-war>true</unpack-war>
</weblogic-web-app>

这样Weblogic部署时会把WAR解压到文件系统,mappingDirectoryLocations就能找到对应的目录了。不过这种方式依赖服务器配置,如果换个环境可能还要重新设置。

解决方案2:改用类路径方式加载映射文件(推荐)

不需要依赖服务器配置,直接修改LocalSessionFactoryBean的配置,用mappingLocations来指定类路径下的映射文件,这样不管WAR是否展开,Spring都能通过类加载器读取资源:

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <!-- 匹配指定包下所有的.hbm.xml映射文件 -->
    <property name="mappingLocations" value="classpath*:com/myorg/division/myapp/model/**/*.hbm.xml" />
    <!-- 别忘了加上数据源、Hibernate属性等其他配置 -->
</bean>

这里的classpath*:表示扫描所有类路径下的资源,**/*.hbm.xml会递归查找指定包下的所有Hibernate映射文件,适配性更强。

解决方案3:用注解映射+包扫描(更简洁)

如果你的实体类用的是Hibernate注解(比如@Entity、@Table),那完全可以不用维护XML映射文件,直接让Spring扫描指定包下的实体类:

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <!-- 扫描指定包下的所有实体类,自动识别注解映射 -->
    <property name="packagesToScan" value="com.myorg.division.myapp.model" />
    <!-- 其他必要配置 -->
</bean>

这种方式最简洁,也避免了手动维护映射文件的麻烦,是现在Spring+Hibernate整合的主流做法。

内容的提问来源于stack exchange,提问作者Kingamere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:39:51