我們正在使用JPA,並試圖堅持標準規範(並避免Hibernate特有的功能)。引用來自persistence.xml的maven依賴關係jar的artifactId
我們在另一個項目(A)中使用一個項目(我們稱之爲X)作爲Maven依賴項。
我們需要JPA掃描實體項目X以及掃描項目A.
爲此,我們在添加了一行
<jar-file>lib/X-v5-4.0.jar</jar-file>
內
<persistence-unit>
persistence.xml中。這工作正常。
我們現在仍然存在的問題是,我們現在需要指定項目X的版本,不僅在pom.xml中,而且在persistence.xml中。這是未來部署問題的祕訣。
我們已經想出了使用Maven資源過濾系統:
<jar-file>lib/X-v5-${x-version}.jar</jar-file>
persistence.xml中和
<properties>
<x-version>4.0</x-version>
</properties>
和$ {X-版本} 在pom.xml中。
這個方法可行,但仍不完美,因爲每次項目X獲得新版本時,我們都必須記住在非標準位置更新版本號。
理想情況下,我們希望可以調整pom.xml的依賴部分中的版本信息,並且更改會自動傳播到persistence.xml。我們今後會減少很多可能出現的錯誤。
這可能嗎?
編輯(我們的解決方案):
我們已經加入了一個名爲jpa.xml文件。我們定義了一個entityManagerFactory,一個persistenceAnnotationBeanPostProcessor和一個transactionManager。這裏的重要部分是entityManagerFactory bean。它有一個屬性「packagesToScan」,允許你指定特定的包來掃描實體放入持久化上下文中。
的代碼段:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="jpaDataSource" />
<property name="loadTimeWeaver">
<bean
class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
</property>
<property name="packagesToScan">
<list>
<value>org.com.our.external.library.package1</value>
<value>org.com.our.external.library.package2</value>
<value>org.com.our.external.library.package3</value>
</list>
</property>
</bean>
我敢肯定,你看到的好處是:因爲我們指的是這些庫包簽名,我們再也不用擔心罐子版本號。
我碰到與我的項目同樣的情況。你有沒有找到這個問題的一個很好的解決方案? – 2014-02-12 04:00:31
@EricB。我已經將該解決方案添加爲我的問題的編輯。我希望這有幫助。 – Zaan 2014-02-19 13:35:08
謝謝。我最終也使用了同樣的東西,但要注意的是它不是JPA標準。但是我放棄了JPA標準解決方案。我確實找到了一個叫做'jpa-maven-plugin'的插件(http://ljnelson.github.io/jpa-maven-plugin/),你可以在Maven構建期間使用它來更新persistence.xml文件。 – 2014-02-19 17:01:48