2011-07-05 41 views
0

我正在開發一個基於Java/Spring/Hibernate的Web應用程序,在Eclipse中開發。如何外部化Hibernate實體?

這個web應用程序實際上是兩個不同的項目,它們複製一對Hibernate實體類以及它們各自的Hibernate存儲庫類。顯然,採用重複代碼並將其移入外部JAR文件或其他內容會很好。

從Hibernate文檔中,我知道我應該把實體類放在一個包含persistence.xml文件的新JAVA項目中。我也知道我可以將這個項目導出到JAR中,並將其包含在我的主要項目的類路徑中。此外,我知道我應該從我的主項目中的hibernate.cfg.xml引用此JAR。

出於某種原因,我現在正在處理的項目似乎並不那麼簡單。

這裏有幾個問題:

  1. 我持有的共享代碼外部項目

    ,我可以包括休眠倉儲類是它嗎?在persistence.xml中應該如何注意,如果確實需要它的話?

  2. 在我的外部JAR中,persistence.xml的最小值是多少?例如,主項目已經配置了休眠方言,所以我可以不用這個外部JAR的persistence.xml

  3. 從Hibernate文檔中,我知道我可以使用我的hibernate.cfg.xml中的<jar-file>標記引用我的外部JAR文件。那麼,如果我的項目沒有hibernate.cfg.xml?我們有一個Spring配置xml,它給org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean一個annotatedClasses屬性。我沒有找到運用AnnotationSessionFactoryBean引用外部JAR文件的例子。

我試過在這個網站上搜索,但還沒有找到任何類似的東西來幫助我。道歉,如果這是一個重複的職位,或一個愚蠢的明顯問題或某事。

感謝提前:)

編輯:

OK,所以它看起來像什麼,我最終需要知道的是,假設我已經包括在我的類路徑"MY_TEST.jar",並進一步假設"MY_TEST.jar"有一個註釋休眠類:src.shared.myEntity.java

我將如何去引用這個實體類與下面的Spring配置摘錄? (無論我嘗試什麼,幾乎總是得到IllegalArgumentException: Cannot find class

<bean id="my.postgres.sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 

    <property name="dataSource" 
     ref="my.postgres.dataSource" /> 

    <property name="annotatedClasses"> 
     <list> 
     <value>src.app.EntityA</value> 
     <value>src.app.EntityB</value> 
     </list> 
    </property> 
    ......... 
</bean> 

回答

0

Hibernate沒有存儲庫的概念。 春天呢。

Hibernate不關心持久化實體類的位置。 它們必須在類路徑中,即所有。 無論它們是否在一個, 兩個, 或三個罐子都不重要,如果所有這些罐子都在類路徑中。

根據需要組織項目,並確保在類路徑中沒有兩個不同的hibernate配置文件。 我會使用一個項目來保存所有常用實體以及它們相關的存儲庫,並讓主項目定義休眠配置文件。

如果共享類的全名是src.shared.myEntity, 那麼Spring配置應具有以下行:

<property name="annotatedClasses"> 
    <list> 
    ... 
    <value>src.shared.myEntity</value> 
    </list> 
</property> 

你的措辭是混亂的, 所以我會檢查我認爲很明顯, 但這可能不是。 類的完全限定名由其完整包名組成,後跟該類的名稱 ,不帶.class或.java擴展名。 該jar必須包含.class文件, 而不是.java文件。 jar中目錄的層次結構必須準確映射包的層次結構。 所以,如果你的實體是這樣的:

package src.shared; 

@Entity 
public class myEntity { 
    // ... 
} 

罐子應該有, 在它的根, 一個src目錄,包含 一個shared目錄,包含myEntity.class文件 。

PS:有src作爲根包的名字真的很奇怪。 爲什麼不尊重約定:com.yourcompany.yourproject ...?

PPS:類名應始終以大寫字母開始: MyEntity而不是myEntity

+0

嘿,感謝您的快速響應!對不起,我關於存儲庫的事情錯過了。 我在我的類路徑中有我的外部jar,但我在使用Spring配置中的AnnotationSessionFactoryBean屬性引用它時遇到了問題。同樣,Hibernate文檔給出了一個如何用hibernate.cfg.xml文件完成的清晰示例,但原始項目架構師決定不包含這個,而是通過Spring的配置來配置所有內容。一切都在編譯,但是spring找不到我的外部實體類 – Langecrew

+0

然後向我們展示您遇到問題的彈簧配置,並告訴我們發生了哪種異常(堆棧跟蹤)。但春天也不在乎罐子。如果某個類在類路徑中,它會找到它。 –

+0

發表在我原來的帖子的編輯 – Langecrew