2

是否可以将休眠映射 hbm.xml 嵌入到 jar 中并避免在 applicationContext.xml 中手动引用,例如

  <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
      <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">
          org.hibernate.dialect.MySQLDialect
        </prop>
      </props>
    </property>
    <property name="mappingResources">
      <list>
        <value>
          com/…/domain/Question.hbm.xml

并将其指向一个罐子/等?
Nhibernate 有这样一个选项来指向一个程序集,它从那里获取 hbm。
注释不是一种选择

编辑: 编辑:我的意图是删除对 hbm 的手动引用,并指向一个通用位置,hibernate 可以从中获取它

  <list>
    <value>
      com/.../Question.hbm.xml
    </value>
    <value>com/.../Users.hbm.xml</value>
    <value>
      com/.../Answers.hbm.xml
    </value>
4

5 回答 5

6

还要澄清一下:您是在专门讨论 Spring 和 Hibernate,因为您显示的配置是 Spring 的 Hibernate 配置。SpringLocalSessionFactoryBean接受多种不同的方式来设置 Hibernate 映射文件的位置;您只显示使用mappingResources参数,但还有mappingLocations,mappingJarLocationsmappingDirectoryLocations.

我认为对于您的示例,您可能希望使用mappingDirectoryLocations并将其指向 JAR 中的特定目录,例如:

<property name="mappingDirectoryLocations">
      <list>
        <value>
          com/…/domain/
        </value>
      </list>
</property>
于 2009-12-16T18:15:12.197 回答
2

是的,您可以,默认情况下,Spring 在搜索映射文件时会从类路径开始。因此,如果 jar 在您的类路径上,它应该会发现这些文件没有问题,以便将休眠映射文件包含在本地会话工厂 bean 中。

因此,如果您的映射文件位于 my.spring.package 中并且名为 mapping.xml,则路径

my/spring/package/mapping.xml

应该可以正常工作。

编辑

感谢您的评论,我会更新我的答案。

,你不能指向一个罐子......但是的,你可以指向罐子中的映射文件。

于 2009-12-16T18:02:59.723 回答
1

我使用 mappingJarLocations 属性来拉入给定 jar 中的所有 *hbm.xml 文件:

<bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="mappingJarLocations">
        <list>
            <value>WEB-INF/lib/my-lib.jar</value>
            ...

顺便说一句,AnnotationSessionFactoryBean 与注释和映射文件配合得很好。

编辑:我重新阅读了其中一些帖子,我还想指出,您可以通过创建抽象 bean 定义来减少重复的内容,如下所示:

<bean id="annotatedClassList" abstract="true">
    <property name="packagesToScan">
        <list>
            <value>com.foo.*.*</value>
            <value>com.foo.*.*.*</value>
            <value>com.foo.*.*.*.*</value>
        </list>
    </property>
</bean>

<bean id="writingSessionFactory"
      parent="annotatedClassList"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="mappingJarLocations">
    ...

<bean id="readingSessionFactory"
      parent="annotatedClassList"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="mappingJarLocations">
    ...
于 2009-12-16T18:27:40.170 回答
1

这解决了我的问题

 <build>   <sourceDirectory>src/main/java</sourceDirectory>  
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
    </resource>
</resources>

于 2015-11-11T03:43:24.603 回答
0

这个对我有用:

<property name="mappingJarLocations">
    <list>
        <value>file:**/yourJarContainHbms.jar</value>
    </list>
</property>
于 2013-01-14T08:46:40.913 回答