Spring会话工厂没有在具有相同类路径的多个目录中查找映射文件

时间:2013-06-13 07:49:11

标签: spring hibernate classpath

从多个路径加载hibernate映射时遇到问题。

我的Spring会话工厂定义如下:

<beans>
  ...
  <bean id="sessionFactory" class="org.springframwork.orm.hibernate3.LocalSessionFactory">
  </bean>

  <property name="mappingLocations">
    <list>
      <value>classpath:/mapping/*.hbm.xml</value>
    </list>
  </property>

当我将映射Foo.hbm.xmlBar.hbm.xml放入目录src/main/resources/mappings时,在初始化Hibernate时会找到两个映射。

但是当我将Foo.hbm.xml放入目录src/main/resources/mappingBar.hbm.xml进入目录src/test/resources/mapping时,只能找到后一个映射文件。 Hibernate将因“无法找到Foo的映射”错误而失败。

我可以看到映射被复制到目录target/classes/mappingtarget/test-classes/mapping,那么为什么不能休眠(或Spring本地会话工厂bean)找到两个映射文件?我认为“classpath:/ mapping / * .hbm.xml”会找到target/classes/mappingtarget/test-classes/mapping目录吗?

编辑:我在运行单元测试时遇到此问题,因此我希望找到src/main/resourcessrc/test/resources中找到的映射。

1 个答案:

答案 0 :(得分:0)

你正在使用maven。由于您将Bar映射放入测试资源目录,因此仅在运行测试时可用。

我假设你有一个类似于下面例子的持久性单元

<persistence-unit ...>
    <class>something.Foo</class>
    <class>something.Bar</class>
</persistence-unit>

启动时发生的事情是Spring启动Hibernate,hibernates读取持久性单元并询问工厂的映射。但请记住,Bar只是一个测试类。所以Spring从src/main/resources找到映射,但由于它不作为测试运行,因此它看不到src/test/resources