发生Could not parse mapping document from resource错误时

本文主要探讨了Hibernate框架中出现的DuplicateMappingException异常及其解决办法。通常这类问题源于映射文件配置错误,如文件名拼写错误或重复的类映射。文章提供了详细的异常堆栈跟踪,并指导开发者如何排查映射文件中的大小写问题和其他潜在错误。

Could not parse mapping document from resource *****

at org.hibernate.cfg.Configuration.addResource(Configuration.java:671)
 at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1679)
 at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1647)
 at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1626)
 at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1600)
 at org.hibernate.cfg.Configuration.configure(Configuration.java:1520)
 at com.govweb.orm.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:69)
 at com.govweb.orm.HibernateSessionFactory.getSession(HibernateSessionFactory.java:53)

Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping *****

 at org.hibernate.cfg.Configuration$MappingsImpl.addClass(Configuration.java:2407)
 at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:173)
 at org.hibernate.cfg.Configuration.add(Configuration.java:771)
 at org.hibernate.cfg.Configuration.addInputStream(Configuration.java:606)
 at org.hibernate.cfg.Configuration.addResource(Configuration.java:668)

时,大部分是因为hibernate的映射文件错误或者是映射文件名错误,这时应该仔细检查,尤其是大小写的问题.另外如果错误的是hibernate.cfg中第一包含的映射文件可能并不是当前提示错误造成的,很有可能是其它的映射文件,这点需要注意。

本文转自: http://www.itleft.com/archives/28.html

] ERROR o.s.b.SpringApplication - [reportFailure,821] - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysConfigController': Unsatisfied dependency expressed through field 'configService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysConfigServiceImpl': Unsatisfied dependency expressed through field 'configMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysConfigMapper' defined in URL [jar:file:/C:/erp/java/erp-modules-system.jar!/BOOT-INF/classes!/com/erp/system/mapper/SysConfigMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'URL [jar:file:/C:/erp/java/erp-modules-system.jar!/BOOT-INF/classes!/mapper/system/SysConfigMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'URL [jar:file:/C:/erp/java/erp-modules-system.jar!/BOOT-INF/classes!/mapper/system/SysConfigMapper.xml]'. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'SysConfig'. Cause: java.lang.ClassNotFoundException: Cannot find class: SysConfig at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$213/1525037790.getObject(Unknown Source) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:920) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) at com.erp.system.ErpSystemApplication.main(ErpSystemApplication.java:23) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysConfigServiceImpl': Unsatisfied dependency expressed through field 'configMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysConfigMapper' defined in URL [jar:file:/C:/erp/java/erp-modules-system.jar!/BOOT-INF/classes!/com/erp/system/mapper/SysConfigMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'URL [jar:file:/C:/erp/java/erp-modules-system.jar!/BOOT-INF/classes!/mapper/system/SysConfigMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'URL [jar:file:/C:/erp/java/erp-modules-system.jar!/BOOT-INF/classes!/mapper/system/SysConfigMapper.xml]'. Cause: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'SysConfig'. Cause: java.lang.ClassNotFoundException: Cannot find class: SysConfig at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.AbstractBeanFactory你再看看
最新发布
11-11
### 重复实体映射导致的映射文档解析失败问题分析与解决方案 在 Hibernate 或 JPA 的使用过程中,当出现 `duplicate class/entity mapping` 错误,通常意味着某个实体类被重复映射,导致框架无法正确解析映射文档。具体表现为映射冲突,如 `could not parse mapping document` 或 `Duplicate collection role mapping` 等异常信息[^1]。 #### 常见原因分析 - **重复注册实体类** 在 Hibernate 配置文件 `hibernate.cfg.xml` 中,若同一个实体类通过 `<mapping>` 标签多次注册,会导致 Hibernate 在初始化重复加载该类,从而抛出映射冲突异常。例如: ```xml <mapping class="com.chenj.dao.Qh6Transauthority"/> <mapping class="com.chenj.dao.Qh6Transauthority"/> <!-- 重复 --> ``` 此类重复注册行为会直接导致映射解析失败。 - **多个实体类映射到同一张数据库表** 若多个类使用相同的 `@Table(name = "xxx")` 注解映射到同一张表,Hibernate 会因无法确定使用哪个类进行操作而抛出异常。 - **Spring Boot 中的自动扫描机制** 在 Spring Boot 项目中,若未正确配置实体扫描路径,可能导致多个模块或包中的实体类被重复注册。例如,未使用 `@EntityScan` 或扫描路径冲突,会引发此类问题。 - **依赖冲突导致类重复加载** 构建工具如 Maven 或 Gradle 若引入多个包含相同实体类的依赖,会导致类路径中存在重复类文件,从而被 Hibernate 多次加载。 #### 解决方案 - **清理 Hibernate 映射配置** 确保 `hibernate.cfg.xml` 文件中每个实体类只被注册一次。例如: ```xml <mapping class="com.chenj.dao.Qh6Transauthority"/> ``` 删除所有重复的 `<mapping>` 条目,避免 Hibernate 多次加载相同类。 - **确保实体类唯一映射数据库表** 检查所有使用 `@Entity` 和 `@Table` 注解的类,确保每个数据库表只被一个实体类映射。若存在多个类映射同一张表,需合并或重构实体类。 - **合理配置 Spring Boot 实体扫描** 使用 `@EntityScan` 注解指定实体类所在的包,避免自动扫描机制加载重复类。例如: ```java @EntityScan(basePackages = "com.chenj.dao") public class Application { // 主类内容 } ``` 这样可以限定实体类的加载范围,避免重复注册。 - **排除依赖冲突** 在 Maven 的 `pom.xml` 文件中,可通过 `<exclusion>` 排除重复的依赖模块。例如: ```xml <dependency> <groupId>com.example</groupId> <artifactId>some-module</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>com.chenj</groupId> <artifactId>dao-module</artifactId> </exclusion> </exclusions> </dependency> ``` 通过排除重复依赖,可以防止相同类被多次加载。 - **启用日志排查映射冲突** 启用 Hibernate 的详细日志输出,查看实体类的注册情况。例如,在 `application.properties` 中开启日志: ```properties logging.level.org.hibernate=DEBUG ``` 通过日志信息可以确认哪些类被重复加载,从而快速定位问题。 #### 示例:修复重复映射配置 假设实体类如下: ```java @Entity @Table(name = "qh6_transauthority") public class Qh6Transauthority { // 实体字段和方法 } ``` 确保该类在 `hibernate.cfg.xml` 中只被注册一次: ```xml <mapping class="com.chenj.dao.Qh6Transauthority"/> ``` 同,检查是否有其他类也映射到 `qh6_transauthority` 表,若有则需调整映射配置或合并实体类。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值