Java 如何依赖单独项目中的hibernate注释映射?

Java 如何依赖单独项目中的hibernate注释映射?,java,hibernate,hibernate-annotations,Java,Hibernate,Hibernate Annotations,我正在尝试解决如何为共享某些实体的两个不同项目进行映射。因为它们只共享有限的映射子集,所以我的第一个想法是将这些映射分离到一个单独的jar中。我使用hibernate注释进行映射(因此它们位于类文件中,而不是单独的XML) 项目A和项目B都依赖于这个映射项目,它只包含两个hibernate映射。项目A没有自己的映射,但项目B有。无论我做什么,这似乎总是会导致问题,因为如果我不为mappings项目配置持久化单元,映射就永远不会被发现。对于项目B也是如此。如果我在mappings项目中配置了持久化

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

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


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

我不知道您是否使用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>

类路径:br/com/ar/model/repository/hql.ar.hbm.xml
类路径:br/com/br/model/repository/hql.br.hbm.xml
类路径:br/com/cr/model/repository/hql.cr.hbm.xml
br.com.ar.model.domain
br.com.br.model.domain
br.com.cr.model.domain
org.hibernate.dialogue.oracle9dialogue
UTF-8
真的
真的
假的
我希望它能有用

更新

根据JPA规范

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

  • 一个或多个对象/关系映射XML文件
  • 将搜索类的一个或多个jar文件
  • 类的显式列表
  • 包含在持久性单元根目录中的带注释的托管持久性类(除非指定了排除未列出的类元素
如下

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

br.com.ar.model.domain.A
br.com.ar.model.domain.B
../lib/customer.jar
mapping.xml
属性在这里

谢谢,看起来很有用。我不是自己创建SessionFactory,而是通过spring的LocalContainerEntityManagerFactoryBean(即,它通过查看persistence.xml构建HibernatePersistence)。很可能这是错误的,但您不知道如何通过持久性文件中的某些配置来实现相同的结果?@wds抱歉,但据我所知,LocalContainerEntityManagerFactoryBean不提供类似的行为。见更新,谢谢。似乎任何一种方法分离映射都不会节省时间。接口相当稳定,DB级别的更改可能需要在两个项目的代码中进行逻辑更改,因此我现在将复制映射(毕竟只有3个类,但它就是这样开始的)。我接受你的回答是因为它回答了问题,尽管不是我希望的那样。:-)
<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>