2010-08-03 52 views
3

我正在努力解决如何为共享某些实体的两个不同项目进行映射。由于它们只共享有限的映射子集,我的第一个想法是将这些映射分离出来放入单独的jar中。我使用hibernate注释来完成映射(所以它们在类文件中,而不是单独的XML)。如何依赖来自单独项目的hibernate注释映射?

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

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

我相信这是由项目B拥有自己的持久性单元造成的,显然这两个并没有被合并。我真的不希望他们,我宁愿只在项目A/B中配置一个,而不是他们依赖的jar。那么是否有一种方法可以让hibernate扫描并将注释映射到依赖关系jar中,并将它们添加到当前的持久性单元中?

回答

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> 

我希望它可以是有用的

UPDATE

根据JPA规范

该组由一个持久单元管理管持久类的通过使用一个或多个下列定义:

  • 一个或多个对象/关系映射的XML文件
  • 一个或多个jar文件将被搜索类
  • 类的显式列表
  • 批注d管理

(除非排除-不公开的类元素被指定)包含在所述持久性单元的根持久类如下

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

由于看起来是有用的。我不是自己创建SessionFactory,而是通过Spring的LocalContainerEntityManagerFactoryBean(即通过查看persistence.xml来构造HibernatePersistence)。很可能这只是错误的,但是你不知道如何通过持久性文件中的某些配置来获得相同的结果? – wds 2010-08-03 12:13:36

+0

@wds对不起,但据我所知,LocalContainerEntityManagerFactoryBean不提供类似的行为。查看更新 – 2010-08-03 12:49:05

+0

好的,谢谢。看起来分离映射的任何方式都不会成为一个定时器。接口相当稳定,数据库级别的变化可能需要对两个项目代码进行逻辑更改,所以我现在要复制映射(毕竟只有3个类,但这就是它的启动方式)。我接受你的答案,因为它回答了问题,而不是我希望的方式。 :-) – wds 2010-08-06 12:50:34