3

我正在尝试研究如何为共享某些实体的两个不同项目进行映射。由于它们只共享有限的映射子集,我的第一个想法是将这些映射分离到一个单独的 jar 中。我正在使用休眠注释来进行映射(所以它们在类文件中,而不是单独的 XML 中)。

项目 A 和项目 B 都依赖于这个映射项目,它只包含几个休眠映射。项目 A 没有自己的映射,但项目 B 有。无论我做什么,这似乎总是会导致问题,因为如果我不为映射项目配置持久性单元,则映射永远不会被拾取。对于项目 B 也是如此。如果我在映射项目中配置了持久性单元,项目 A 可以工作,但在项目 B 中运行查询只会给我(Mapping恰好是类的名称):

java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: Mapping is not mapped

我相信这是由于项目 B 有自己的持久性单元造成的,显然这两者没有被合并。我也不希望他们这样做,我宁愿只在项目 A/B 中配置一个,而不是他们所依赖的 jar。那么有没有办法告诉hibernate扫描和映射依赖jar中的注释并将它们添加到当前的持久化单元中?

4

1 回答 1

2

我不知道您是否使用 Spring,但我使用 Spring 功能通过使用packagesToScan属性和mappingLocations属性来获得此行为,如下所示

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingLocations">
        <util:list>
            <value>classpath:br/com/ar/model/repository/hql.ar.hbm.xml</value>
            <value>classpath:br/com/br/model/repository/hql.br.hbm.xml</value>
            <value>classpath:br/com/cr/model/repository/hql.cr.hbm.xml</value>
        </util:list>
    </property>
    <property name="packagesToScan">
        <util:list>
            <value>br.com.ar.model.domain</value>
            <value>br.com.br.model.domain</value>
            <value>br.com.cr.model.domain</value>
        </util:list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
            <prop key="hibernate.connection.charSet">UTF-8</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.validator.autoregister_listeners">false</prop>
        </props>
    </property>
</bean>

我希望它可以有用

更新

根据 JPA 规范

由持久性单元管理的托管持久性类集是通过使用以下一项或多项定义的

  • 一个或多个对象/关系映射 XML 文件
  • 将搜索类的一个或多个 jar 文件
  • 明确的类列表
  • 包含在持久单元根中的带注释的托管持久类(除非指定了 exclude-unlisted-classes 元素

如下

<persistence>
    <persistence-unit name="titan">
        <!--Explicity list of classes-->
        <class>br.com.ar.model.domain.A</class>
        <class>br.com.ar.model.domain.B</class>
        <!--Set up any jar file by using jar-file element-->
        <!--Its value is a path relative to the JAR file that contains persistence.xml-->
        <jar-file>../lib/customer.jar</jar-file>
        <!--ORM mapping file-->
        <!--It may be present anywhere on the class path-->
        <mapping-file>mapping.xml</mapping-file>
        <properties>
            Properties goes here
        </properties>
    </persistence-unit>
</persistence>
于 2010-08-03T10:53:42.793 回答