【问题标题】:Hibernate and JPA error: duplicate import on dependent Maven projectHibernate 和 JPA 错误:依赖 Maven 项目的重复导入
【发布时间】:2014-08-09 17:57:45
【问题描述】:

我有两个 Maven 项目,一个名为 project-data,另一个名为 project-rest它依赖于 project-data 项目。

Maven 构建在 project-data 项目中成功,但在 project-rest 项目中失败,例外情况:

Caused by: org.hibernate.DuplicateMappingException: duplicate import: TemplatePageTag refers to both com.thalasoft.learnintouch.data.jpa.domain.TemplatePageTag and com.thalasoft.learnintouch.data.dao.domain.TemplatePageTag (try using auto-import="false")

我可以在这里看到一些解释:http://isolasoftware.it/2011/10/14/hibernate-and-jpa-error-duplicate-import-try-using-auto-importfalse/

我不明白的是,为什么在构建 project-data 项目时不会出现此消息,而在构建 project-rest 项目时会出现此消息。 p>

我尝试在 pom.xml 文件中查找以查看其中是否有可以解释问题的内容。

我还查看了在 project-rest 项目上配置和运行测试的方式。

但我还没有看到任何东西。

【问题讨论】:

  • 能否提供项目的 pom 文件?
  • 我添加了两个 Maven 项目。我只花了几个小时,在 -X 调试模式下运行 Maven,仍然没有任何进展。
  • 从 learningtouch-rest 项目运行 mvn -Dtest=GreetingControllerTest test 时附加了什么?成功与否?
  • 不,它不成功。它甚至无法加载上下文。您可以尝试构建它。所有源代码均可下载。

标签: maven jpa dependencies maven-module


【解决方案1】:

错误基本上是由于sessionFactory bean 位于两个具有相同逻辑名称TemplatePageTag实体 的基础上:: p>

  • 一个位于 com.thalasoft.learnintouch.data.jpa.domain 包下。
  • com.thalasoft.learnintouch.data.dao.domain下的另一个。

自从今年秋天到一个不寻常的案例,你将有 Hibernate 抱怨这个案例。主要是因为您在运行一些 HQL 查询(基本上是面向实体的查询)时可能会遇到最终问题,并且可能会产生不一致的结果。

作为一种解决方案,您可能需要:

  • 用不同的名称重命名您的 Entity bean 以避免混淆,我认为这在您的情况下不是一个合适的解决方案,因为它可能需要大量重构并且可能会损害您的项目兼容性。

    李>
  • 配置您的 EJB 实体以使用不同的名称进行解析。由于您使用基于 xml 的处理配置一个实体,而另一个通过注释配置,因此定义实体名称的架构不同:

    • 对于 com.thalasoft.learnintouch.data.jpa.domain.TemplatePageTag 实体,您需要将name 属性添加到@Entity 注释中,如下所示:

      @Entity(name = "TemplatePageTag_1")
      public class TemplatePageTag extends AbstractEntity {
        //...
      }
      
    • 对于 com.thalasoft.learnintouch.data.dao.domain.TemplatePageTag,因为它是使用 hbm xml 声明映射的,所以您需要将 entity-name 属性添加到您的 @987654327 @元素如下:

      <hibernate-mapping>
        <class name="com.thalasoft.learnintouch.data.dao.domain.TemplatePageTag"
          table="template_page_tag"
          entity-name="TemplatePageTag_2"
          dynamic-insert="true"
          dynamic-update="true">
      
          <!-- other attributes declaration -->
      
        </class>
      </hibernate-mapping>
      

当我深入了解您的项目结构时,您可能还需要修复其他 bean 的实体名称,因为您一直在为许多其他类遵循相同的架构,例如 com.thalasoft.learnintouch.data .jpa.domain.AdminModulecom.thalasoft.learnintouch.data.dao.domain.AdminModule

【讨论】:

  • 感谢您提供如此详细的解释。我已经知道这个问题的性质,因为它在我的问题中的 SO 链接中得到了很好的描述。我不倾向于重命名我所有的 116 个实体。另外,我的问题不是问题是什么,而是为什么问题出现在依赖项目、REST 项目而不是 DATA 项目中。 REST 项目中有一些东西会触发问题,很可能是测试的配置方式。 DATA项目的测试通过了。 REST 项目中的测试没有理由不能通过。
  • 可以在 Maven 项目的源代码中看到,DATA 项目针对 Hibernate DAO 层和 JPA 存储库层进行了集成测试。测试上下文不会同时加载 Hibernate DAO 层和 JPA 存储库层。因此,只要测试上下文不同时加载它们,就可以在一个项目中同时拥有它们。 JPA 存储库层将取代 Hibernate DAO 层。 REST 项目只是尝试使用 JPA 存储库层。它不应该尝试加载 Hibernate DAO 层的上下文。我怀疑它确实如此。
  • 绝妙的解决方案 tmarven!
  • 我认为问题出在路径问题上。该数据项目拥有 DAO 和 JPA 测试,但问题并未出现。其余项目(依赖于数据项目)只是吹嘘 JPA 测试,但必须以某种方式加载 DAO 实体,而实际上它只需要 JPA 实体。
  • 我尝试在 JPA 域类上使用 @Entity(name = "com.thalasoft.learnintouch.data.jpa.domain.ElearningCourseInfo"),在 DAP 映射中使用 entity-name="com.thalasoft.learnintouch.data.dao.domain.ElearningCourseInfo"attribute。但它随后抱怨两个逻辑实体使用相同的物理实体。
【解决方案2】:

这个问题可以通过结合使用@Entity 和@Table 注释来解决。下面的链接提供了一个很好的解释和两者之间的区别。

difference between name-attribute-in-entity-and-table

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2012-06-16
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多