我们正在与 JPA 合作,并努力遵守标准规范(并避免使用 Hibernate 特定的功能)。
我们在另一个项目 (A) 中使用一个项目(我们称之为 X)作为 Maven 依赖项。
我们需要 JPA 来扫描项目 X 中的实体以及扫描项目 A。
为此,我们添加了一行
<jar-file>lib/X-v5-4.0.jar</jar-file>
里面
<persistence-unit>
在 persistence.xml 中。这工作得很好。
我们仍然遇到的问题是,我们现在不仅需要在 pom.xml 中指定项目 X 的版本,还需要在 persistence.xml 中指定项目 X 的版本。这是解决 future 部署问题的秘诀。
我们提出了一个使用 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。通过这种方式,我们可以减少 future 部署中可能出现的许多错误。
这可能吗?
编辑(我们的解决方案):
我们添加了一个名为 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>
我确信您看到了优点:由于我们通过包签名引用这些库,因此我们不再需要担心 jar 版本号。
最佳答案
我是这样解决的:
在 persistence.xml
替换整个<jar-file>
标签,即
<persistence-unit name="PersistenceUnit">
...
<!-- here is where the jar file is supposed to go -->
${importjarfile}
...
</persistence-unit>
最后,按如下方式设置属性:
<properties>
<x-version>4.0</x-version>
<importjarfile><![CDATA[<jar-file>lib/X-v5-${x-version}.jar</jar-file>]]></importjarfile>
</properties>
这样Eclipse就看不到jar-file
了标记并且不会提示。
我的解决方案实际上更干净一些,因为我使用的是 .properties
文件,所以我不必使用 CDATA,我希望它仍然有效。
我的解决方案:
importjarfile = <jar-file>lib/X-v5-${x-version}.jar</jar-file>
关于hibernate - 从 persistence.xml 引用 Maven 依赖项 jar 的artifactId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15437242/