hibernate: Duplicate class/entity; Could not parse mapping document from resource
2016-02-03 16:03
579 查看
近日在学习Hibernate时,总是遇到以下异常:
org.hibernate.InvalidMappingException: Could not parse mapping document from resource kpy/db/Customer.hbm.xml
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3415)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3404)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3392)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1341)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1788)
at kpy.db.CustomerDao.<clinit>(CustomerDao.java:24)
at kpy.HibernateDemo.App.main(App.java:15)
Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mappingkpy.db.Customer
at org.hibernate.cfg.Configuration$MappingsImpl.addClass(Configuration.java:2580)
at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:174)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3412)
... 7 more
测试代码如下:
查找了大量资料,总是找解决问题:原因在于代码中,红色的两句。
在文件/kpy/db/hibernate.cfg.xml中,已经包含了以下这一句:
<mapping resource="kpy/db/Customer.hbm.xml"/>
而在文件中kpy/db/Customer.hbm.xml有如下定义。
<class name="kpy.db.Customer" table="CUSTOMERS">
进行config.configure("/kpy/db/hibernate.cfg.xml");操作时,对XML文件进行解析。根据<class name="kpy.db.Customer" table="CUSTOMERS">已经知道了需要对kpy.db.Customer做映射,因此不再需要config.addClass(Customer.class);
在《精通 Hibernate:Java 对象持久化技术详解(第2版)》一书4.5小节中,有如下描述:
如果Hibernate的配置文件为XML格式,只需要在配置文件中声明映射文件,在程序中不必调用Configuration类的AddClass()方法来加载映射文件。当映射文件名发生变化,只需要修改XML格式的配置文件,不需要修改程序代码,因此XML格式的配置文件会提高应用程序的可维护性。
org.hibernate.InvalidMappingException: Could not parse mapping document from resource kpy/db/Customer.hbm.xml
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3415)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3404)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3392)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1341)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1788)
at kpy.db.CustomerDao.<clinit>(CustomerDao.java:24)
at kpy.HibernateDemo.App.main(App.java:15)
Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mappingkpy.db.Customer
at org.hibernate.cfg.Configuration$MappingsImpl.addClass(Configuration.java:2580)
at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:174)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3412)
... 7 more
测试代码如下:
private static SessionFactory sessionFactory; static { try{ Configuration config = new Configuration(); LogWriter.info("new Configuration success."); // 以下这一句不能少,少了报异常:hibernate Connection cannot be null when 'hibernate.dialect' not set config.configure("/kpy/db/hibernate.cfg.xml"); config.addClass(Customer.class); LogWriter.info("add Customer.class success."); sessionFactory = config.buildSessionFactory(); LogWriter.info("build buildSessionFactory success."); }catch (Exception e){ e.printStackTrace(); } }
查找了大量资料,总是找解决问题:原因在于代码中,红色的两句。
在文件/kpy/db/hibernate.cfg.xml中,已经包含了以下这一句:
<mapping resource="kpy/db/Customer.hbm.xml"/>
而在文件中kpy/db/Customer.hbm.xml有如下定义。
<class name="kpy.db.Customer" table="CUSTOMERS">
进行config.configure("/kpy/db/hibernate.cfg.xml");操作时,对XML文件进行解析。根据<class name="kpy.db.Customer" table="CUSTOMERS">已经知道了需要对kpy.db.Customer做映射,因此不再需要config.addClass(Customer.class);
在《精通 Hibernate:Java 对象持久化技术详解(第2版)》一书4.5小节中,有如下描述:
如果Hibernate的配置文件为XML格式,只需要在配置文件中声明映射文件,在程序中不必调用Configuration类的AddClass()方法来加载映射文件。当映射文件名发生变化,只需要修改XML格式的配置文件,不需要修改程序代码,因此XML格式的配置文件会提高应用程序的可维护性。
相关文章推荐
- IOS工程中Git的.gitignore
- [读书笔记]《Android开发艺术探索》第二章笔记
- 03.CocosCreator资源工作流程
- 深入浅出Android App耗电量统计
- Android类似qq消息滑动菜单
- Source not found-Android 使用隐藏API(1)
- 蓝懿IOS视频播放器
- Android fragment解析2
- iOS 创建静态库(.a)
- Android Studio的初步学习
- Android HandlerThread使用总结
- iOS8开始默认语言有变化
- android shap 画图
- 生还是死?Android 进程优先级详解
- Android Fragment解析1
- Android Sqlite
- Android中Canvas绘图基础详解(附源码下载)
- iOS不规则控件的点击事件(转载)
- android 时间选择器
- Swift快速入门(一)第一个Swift程序