如何依赖来自单独项目的hibernate注释映射?

时间:2010-08-03 10:34:49

标签: java hibernate hibernate-annotations

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

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

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

我认为这是由项目B拥有自己的持久性单元引起的,显然这两者没有被合并。我也不想要它们,我宁愿只在项目A / B中配置一个而不是它们所依赖的jar。那么有没有办法告诉hibernate扫描并映射依赖jar中的注释并将它们添加到当前的持久性单元?

1 个答案:

答案 0 :(得分:2)

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

<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>