jar
在 Oracle 应用程序服务器上的文件中部署时,我遇到了 Hibernate 资源未找到的问题。
我有一些休眠映射文件定义LocalSessionFactoryBean
如下:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingLocations">
<list>
<value>classpath:/mapping/*.hbm.xml</value>
</list>
</property>
...
</bean>
这个 bean 定义在一个文件中applicationContext.xml
。
hibernate 映射、这些映射引用的类以及applicationContext.xml
文件位于foo
生成工件的模块中foo.jar
。
我创建了一个.ear
引用foo.jar
并使用相同文件的applicationContext.xml
文件。当我将其部署.ear
到 Oracle 应用程序服务器时,我看到以下错误:
java.io.FileNotFoundException: class path resource [mapping/] cannot be resolved to absolute file path because it does not reside in the file system: code-source:/.../oas10.1.3/j2ee/.../applications/.../WEB-INF/lib/foo.jar!mapping/
当我检查时,我可以按预期/WEB-INF/lib/foo.jar
看到带有 Hibernate 映射文件的目录。mappings
作为健全性检查,我创建了一个简单的项目,它依赖于foo
并运行以下测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class AppTest {
@Autowired SessionFactory sessionFactory;
@Test
public void loadObjects() {
Session session = sessionFactory.openSession();
List<Foo> results = session.createQuery("from Foo").list();
System.out.println("found " + results.size() + " results");
}
}
这按预期工作:HQL 查询运行,我从数据库中取回正确数量的 Foo 对象。
那么,为什么那个简单的应用程序在foo.jar
工作中引用了映射资源,但在 Oracle 应用服务器上做同样的事情却导致找不到资源呢?
编辑:我尝试使用mappingJarLocations
而不是mappingLocations
:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingJarLocations">
<list>
<value>WEB-INF/lib/foo.jar</value>
</list>
</property>
...
</bean>
并得到了一个FileNotFoundException
.
编辑:我回到使用mappingLocations
而不是mappingJarLocations
(如在我的第一个示例中),但这次我将*.hbm.xml
文件直接复制到.war
文件的WEB-INF/classes
目录中。
毫不奇怪,这奏效了:
setMappingLocations() - file:/.../oas10.1.3/j2ee/.../applications/.../raps-site-9.0/WEB-INF/classes/mapping/Address.hbm.xml
我将按照建议尝试实用程序 jar,但作为一项临时措施,我将修改我pom.xml
的以将映射直接复制到WEB-INF/classes
.