在jar中嵌入hibernate hbm.xml映射

时间:2009-12-16 17:58:00

标签: java hibernate embed hibernate-mapping

是否可以将hibernate映射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

并指向jar / etc?
Nhibernate有这样的选择指向一个组件,从那里它拿起hbm的 注释不是一个选项

修改 编辑: 我的目的是删除对hbm的手动引用并指向hibernate可以从中获取它的通用位置

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

5 个答案:

答案 0 :(得分:6)

只是为了澄清一下:你特别是在谈论Spring和Hibernate,因为你展示的配置是Spring的Hibernate配置。 Spring的LocalSessionFactoryBean接受了许多不同的方法来设置Hibernate映射文件的位置;您只能使用mappingResources参数显示,但还有mappingLocationsmappingJarLocationsmappingDirectoryLocations

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

<property name="mappingDirectoryLocations">
      <list>
        <value>
          com/…/domain/
        </value>
      </list>
</property>

答案 1 :(得分:2)

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

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

my/spring/package/mapping.xml

应该可以正常工作。

修改

感谢您的评论,我将更新我的回答。

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

答案 2 :(得分:1)

我使用mappedJarLocations属性来提取给定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">
    ...

答案 3 :(得分:1)

这解决了我的问题

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

答案 4 :(得分:0)

它对我有用:

<property name="mappingJarLocations">
    <list>
        <value>file:**/yourJarContainHbms.jar</value>
    </list>
</property>