2007年3月19日星期一

hibernate 多表查询错误记录

今天用三个有外键关系的表建立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 条评论:

Unknown 说...

作文后第二天,启动服务器,还是相同的代码,完全没有改动,居然不好用了,错误提示和昨天一样,可是代码应该是已经修改过的
Debug停在昨天添加的那一行,今天把这行删除后却好用了,不明原因,目前正在慨叹被捉弄……

zzzzZZZZ

zzzzZZZZ