关于hibernate中报Duplicate class/entity mapping org.model.User错的问题

本文分享了一位开发者在使用Hibernate框架进行毕业设计时遇到的Duplicateclass/entitymapping问题及其解决过程。作者通过逐步排查,发现是因为在配置文件中重复加载了实体映射导致的错误,并从中总结了编程时需要注意的事项。

我昨天犯了一很傻得错误,现在想起来都感觉很好笑。今天就把她2写下来,一来可以当个笑话供大家娱乐,二来可以当做一次教训吧!!  

  我昨天做了下毕业而设计,在用hibernate存储数据的时候报出了一个Duplicate class/entity mapping org.model.User的错误,我一晚上百度,google都没解决掉。网上最多的只是翻译了下这个错误是什么意思,没有具体的怎么分析解决这个问题,当时感觉非常生气,心想谁不知什么意思啊,还用得着你来给我翻译!有些人还说把HibernateFactory的getSession方法里加一个 synchronized 就可以了。但是我试过仍然没用。最终还是没能解决,就这样不得不我抱着遗憾睡觉了。

  今天早上起床后又开始整昨天的问题,在做的过程中,我试了下,如果只在hibernate.cfg.xml文件中只映射一个*.hbm.xml文件的话是没有问题的,于是我又一次试了几个还是没有问题,我就有些奇怪了,但是当我把hibernate.cfg.xml拉到最下边几行的时候,我看到了这样的一句<mapping resource="org/model"/>,我瞬间明白了,也就是我前边把每个文件载入了一次,后边又再从根目录载入当然会报重复载入实体的错误了。也是在那一瞬间我回忆起当时具体是怎么做的了。我在写程序的时候,边写边跟同学聊天,刚生成了一个*.hbm.xml,在我往hibernate.cfg.xml中置的时候,我发现今天没有向svn提交,于是我提交了下。提交完后跟同学说了句话,说完后就没有继续编辑上次未完成的文件,跑到另一个文件中去写了,写完测试的时候就出现了这种问题。

  这件事感觉是一天发生最好笑的事了,这么小的一个疏忽让我费了这么大的劲。还有就是,看到错误后也没仔细去看下配置文件,它说有重复的实体,那我就仔细去对比每个实体文件了。也可能是经验不足吧!

  从这件事也能得到一些教训,就是写程序的时候真的需要细心认真,不可三心二意,否则发生这种搞笑的事情也是必然的。其次遇事得冷静思考,切不可盲目的搜索浪费时间,掌握分析解决问题的能力。还有经验也很重要,我认为经过这次后,以后再遇到类似的问题我能够很快分析出错误原因的。

### `duplicate class/entity mapping` 误的原因与解决方法 在使用 Hibernate 等 ORM 框架时,`duplicate class/entity mapping` 是一个常见的误。该误通常表示某个实体类被多次映射,或者多个类映射到同一个数据库表,导致框架无法正确解析实体与表之间的映射关系[^1]。 #### 常见原因 1. **同一个实体类被多次注册** 在 Hibernate 配置文件 `hibernate.cfg.xml` 中,如果同一个实体类被多次声明在 `<mapping>` 标签中,则会导致重复映射异常。例如: ```xml <mapping resource="com/chenj/dao/Qh6Transauthority.hbm.xml"/> <mapping resource="com/chenj/dao/Qh6Transauthority.hbm.xml"/> <!-- 重复 --> ``` 这种重复声明会触发 `Duplicate class/entity mapping` 误[^1]。 2. **多个类映射到相同的数据库表** 如果两个不同的实体类都使用 `@Table(name = "same_table")` 注解或 XML 配置映射到同一张表,Hibernate 会无法判断应使用哪个类进行持久化操作。 3. **类路径中存在重复的类文件** 在项目构建过程中,如果依赖管理不当(如 Maven 或 Gradle 依赖冲突),可能导致相同的实体类出现在多个 JAR 包或模块中,从而被框架多次加载。 4. **自动扫描机制导致重复注册** 如果使用 Hibernate 的自动包扫描功能(如 `packagesToScan`),并且实体类分布在多个包中,但被多个配置引用,也可能导致重复注册。 #### 解决方法 1. **检查并清理 `hibernate.cfg.xml` 配置文件** 确保每个实体类只被 `<mapping>` 标签引用一次,避免重复条目。 2. **确保实体类唯一性** 使用 `@Entity(name = "UniqueName")` 注解时,确保实体名称唯一,避免框架混淆。同时,检查是否多个类映射到同一张数据库表。 3. **避免依赖冲突** 在构建工具(如 Maven)中,使用 `<exclusion>` 排除重复的依赖模块,确保实体类只在一个模块中被定义和注册。 4. **配置包扫描排除机制** 在 Spring Boot 中,可以使用 `@ComponentScan` 的 `excludeFilters` 属性,或在 `persistence.xml` 中配置 `exclude-unlisted-classes` 来避免重复加载实体类。 5. **使用日志排查重复映射** 在启动应用时,查看日志中关于实体注册的信息,确认是否某个类被多次加载。例如,Hibernate 会在启动时打印注册的实体类列表。 #### 示例:检查并修复重复映射 假设存在以下实体类: ```java @Entity @Table(name = "qh6_transauthority") public class Qh6Transauthority { // 实体字段和方法 } ``` 确保该类只在 `hibernate.cfg.xml` 中注册一次: ```xml <mapping class="com.chenj.dao.Qh6Transauthority"/> ``` 同时,检查是否有其他类也映射到 `qh6_transauthority` 表。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值