hibernate - 从 persistence.xml 引用 Maven 依赖项 jar 的artifactId

标签 hibernate maven jpa pom.xml

我们正在与 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/

相关文章:

java - 与额外列的多对多关联

java - 如果不用于 DDL 生成,Hibernate @JoinColumn(nullable = false) 是否多余?

java - Maven原型(prototype):generate | Build Failure

hibernate - 无论如何,是否要检查域类中的属性是否为主键?

java - 未绑定(bind)的类路径变量

maven - 使用 cas-server-webapp-tomcat 升级和设置 CAS 5.1.x

java - 查询语法异常 : Unexpected token *

java - 如何声明 OneToMany 成员变量

java - 由 : java. lang.ClassNotFoundException : org. springframework.context.event.EventListenerFactory - Spring Batch 引起

java - 在 JPA/Hibernate 中使用 Spring 定义的 transactionManager