我们正在使用JPA,并尝试遵循标准规范(避免使用Hibernate特定的功能)。
我们在一个项目(称为X)中作为Maven依赖项使用另一个项目(A)。
我们需要JPA扫描项目X和项目A中的实体。
为此,我们添加了一行代码
<jar-file>lib/X-v5-4.0.jar</jar-file>
内部
<persistence-unit>
在persistence.xml中。这个没问题。
我们还有一个问题,现在不仅需要在pom.xml中指定项目X的版本,还需要在persistence.xml中指定。这将导致未来部署时出现问题。
我们想出了一种使用Maven资源过滤的系统:
<jar-file>lib/X-v5-${x-version}.jar</jar-file>
在persistence.xml文件中和
<properties>
<x-version>4.0</x-version>
</properties>
在pom.xml中使用 ${x-version} 是可行的,但仍不完美,因为每次项目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>
我相信你也看到了这个好处:既然我们是通过包签名引用这些库,就不再需要担心JAR版本号的问题。
jpa-maven-plugin
(http://ljnelson.github.io/jpa-maven-plugin/)的插件,你可以在Maven构建期间使用它来更新persistence.xml文件。 - Eric B.