Hibernate和JPA错误:在依赖Maven项目上重复导入

时间:2014-08-09 17:57:46

标签: maven jpa dependencies maven-module

我有两个Maven项目,一个名为 项目数据 ,另一个名为 项目休息 它依赖于 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/

我不明白,为什么在构建项目数据项目时不会发生此消息,并且在构建项目 - 休息项目时发生此消息。

我尝试查看 pom.xml 文件,看看是否有可以解释此问题的内容。

我还查看了测试的配置方式,并在项目 - 休息项目上运行。

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

编辑:添加Maven项目: www.learnintouch.com/learnintouch-data.tar.gz www.learnintouch.com/learnintouch-rest.tar.gz

2 个答案:

答案 0 :(得分:10)

错误主要是因为sessionFactory bean是两个实体的基础,具有相同的逻辑名 TemplatePageTag

  • 一个位于 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属性为class元素,如下所示:

      <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.AdminModule com.thalasoft.learnintouch.data.dao.domain.AdminModule

答案 1 :(得分:0)

可以结合使用@Entity和@Table批注来解决此问题。以下链接提供了很好的解释以及两者之间的区别。

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