2010-08-03 54 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