今天用三个有外键关系的表建立Hibernate,出现一个错误,在网络上查了几个小时,碰壁无数次,终于解决,记录如下
问题描述:
程序不出错,不过不处理HibernateException时程序会出错,并将错误输出到浏览器页面,提示错误行为session(hibernate session)的第一次引用行。可疑代码段:
try {
Configuration cf = new Configuration().configure();
sess = cf.buildSessionFactory().openSession();
} catch (HibernateException e) {
System.out.println("session建立失败:" + e.getMessage());
e.getStackTrace();
return null;
}
碰壁历程:
检查服务器信息,有一个提示最先引起我的注意
INFO [Configuration] Configured SessionFactory: null
其实这个提示是正常的,并不影响程序正常运行
接下来,查找可疑的捕获异常部分代码
catch (HibernateException e) {
System.out.println("session建立失败:" + e.getMessage ());
e.getStackTrace();
}
这里的e.getStackTrace();不能将错误内容输出到服务器,e.getMessage()输出信息如下,其中NewsContent是一个表,有外键指向User表中的一个列:
[STDOUT] session建立失败:Association references unmapped class: pro.news2cms.hibernate.NewsContent
同时,我发现Session对象不能建立,在DEBUG中查寻到的可疑情况是:
表达式: cf.buildSessionFactory()
结果: An exception occurred: org.hibernate.MappingException
同时,服务器输出(newContent是一个表名,它拥有一个外键,指向Users中的一个列):
INFO [HbmBinder] Mapping collection: pro.news2cms.hibernate.Users.newsContents -> news_content
另外,服务器输出中有一下记录(个人认为这是问题的关键)
Association references unmapped class
目前成功的解决方法:
Configuration cf = new Configuration().configure();
cf.addClass (pro.news2cms.hibernate.LogUser.class);
总结:
提示说明hibernate的信息不足以确定全部必要的类,map信息不完整,手动添加addClass是我不希望的行为,因为一旦数据库内容有变动,这里的代码也要受到影响。虽然目前只能如此解决,但我认为应该在相应的.bhm.xml文件中存在问题,如果相应修改,应该可以有更好的解决方法。
1 条评论:
作文后第二天,启动服务器,还是相同的代码,完全没有改动,居然不好用了,错误提示和昨天一样,可是代码应该是已经修改过的
Debug停在昨天添加的那一行,今天把这行删除后却好用了,不明原因,目前正在慨叹被捉弄……
发表评论