【问题标题】:What does "org.hibernate.DuplicateMappingException: Duplicate query mapping" mean in HibernateHibernate 中的“org.hibernate.DuplicateMappingException:重复查询映射”是什么意思
【发布时间】:2019-12-25 07:25:09
【问题描述】:

我正在尝试在带有 JDK8 的 Tomcat8.5 上使用带有 struts2-core-2.3.35 的休眠 5.2.16 运行 Spring webapp。

我收到以下异常:

Caused by: org.hibernate.DuplicateMappingException: Duplicate query mapping getDocExt
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.checkQueryName(InFlightMetadataCollectorImpl.java:524) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.applyNamedQuery(InFlightMetadataCollectorImpl.java:518) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addNamedQuery(InFlightMetadataCollectorImpl.java:514) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.model.source.internal.hbm.NamedQueryBinder.processNamedQuery(NamedQueryBinder.java:75) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.model.source.internal.hbm.NamedQueryBinder.processNamedQuery(NamedQueryBinder.java:39) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.model.source.internal.hbm.MappingDocument.processNamedQueries(MappingDocument.java:198) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.model.source.internal.hbm.HbmMetadataSourceProcessorImpl.processNamedQueries(HbmMetadataSourceProcessorImpl.java:94) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processNamedQueries(MetadataBuildingProcess.java:173) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:269) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.springframework.orm.hibernate5.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:511) ~[spring-orm-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:495) ~[spring-orm-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1688) ~[spring-beans-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1626) ~[spring-beans-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312) ~[spring-beans-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308) ~[spring-beans-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) ~[spring-beans-4.3.15.RELEASE.jar:4.3.15.RELEASE]
    ... 24 more

当我查找这个异常时,大多数答案都与

有关
org.hibernate.DuplicateMappingException: Duplicate class/entity mapping

这是不同的,因为我得到的异常没有“重复的类/实体映射”。而对我来说,它的“重复查询映射”。

出现此异常的原因可能是什么。

【问题讨论】:

  • 如果您想得到正式的答复,您可能需要向我们展示相关的 Java/Spring 代码。
  • 你似乎定义了两个同名的命名查询getDocExt

标签: java mysql hibernate orm hibernate-5.x


【解决方案1】:

引起:org.hibernate.DuplicateMappingException:重复查询 映射getDocExt

堆栈跟踪中的这一行清楚地表明您不小心定义了两个具有相同名称的named queries - getDocExt。这两个具有相同名称的命名查询不一定要在同一个实体上才会发生此错误。即使在两个不同的实体上声明了这些重复的命名查询,您仍然会收到此错误。这是因为命名查询的范围是整个持久性单元。找出重复的命名查询并选择不同的名称。作为一种良好的编程习惯,请选择诸如<entity>.getDocExt 之类的名称,而不仅仅是getDocExt。如果您采用这种做法,您将永远不会出现此错误。

【讨论】:

  • 就我而言,我已将相同的 NamedQueries 复制/粘贴到两个不同的实体/文件中。更改了查询参数但错过了名称相同。
【解决方案2】:

发生这种情况的一个原因是同时使用了配置文件和注释。 检查您是否在

中定义了映射
hibernate config file
annotations - java class

例如:在休眠配置文件中

<mapping class="com.xxx.City" />

在 Java 中

@Entity
@Table(name = "city_master")
public class City implements Serializable {

}

【讨论】:

    【解决方案3】:

    由于命名查询的名称重复,如下所示。

    <named-query name="getDocExt">
    <query>
        some query
    </query>
    </named-query>
    
    <named-query name="getDocExt">
    <query>
        some query
    </query>
    </named-query>
    

    注意:命名查询名称应该是唯一的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-09
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多