项目闹鬼之hibernate2.1.6

本文探讨了在使用Hibernate框架时遇到的一个问题:在特定情况下,由于不同版本的Hibernate对Key对象的处理方式不同,导致了ClassCastException异常。文章详细分析了问题的原因,并介绍了如何通过更新Hibernate版本来解决这一问题。

项目用的持久化层是hibernate 2.1.6.
前不久出现一个错误,简单描述一下:

现有3个对象:Party,TParty和Individual,其中Individual是Party的子类,Party和TParty各自独立,两个对象都映射到表T_Party。

当独立执行Individual person = (Individual)session.load(Individual.class, id)时,系统正确,.
而在同一thread下(OpenSessionInView),先session.find("from TParty"),再Individual person = (Individual)session.load(Individual.class, id)系统报错ClassCastException,经查此时系统返回的是TParty对象。

初步断定是hibernate问题,参看hiberante 2.1.7没有觉的有什么问题(因为自己电脑本地有这个版本,事实证明这是个错误)。折腾了一天,没有发现问题所在,最后只好下载了hibernate2.1.6,立刻发现问题所在。
hibernate在load对象时,会通过getEntity(key)查看是否加载过,而Key对象几个主要方法如下:

ExpandedBlockStart.gifContractedBlock.gifprivate  Key(Serializable id, Serializable identifierSpace, Class clazz,  boolean  batchLoadable)  dot.gif {
InBlock.gif        
if  (id == null throw   new  AssertionFailure( " null identifier " );
InBlock.gif        
this .identifier = id;
InBlock.gif        
this .identifierSpace  =  identifierSpace;
InBlock.gif        
this .clazz  =  clazz;
InBlock.gif        
this .isBatchLoadable  =  batchLoadable;
ExpandedBlockEnd.gif    }

None.gif    
ExpandedBlockStart.gifContractedBlock.gif    
/** */ /**
InBlock.gif     * Construct a unique identifier for an entity class instance
ExpandedBlockEnd.gif     
*/

ExpandedBlockStart.gifContractedBlock.gif    
public  Key(Serializable id, ClassPersister p)  dot.gif {
InBlock.gif        
this ( id, p.getIdentifierSpace(), p.getMappedClass(), p.isBatchLoadable() );
ExpandedBlockEnd.gif    }

None.gif
ExpandedBlockStart.gifContractedBlock.gif
public   boolean  equals(Object other)  dot.gif {
InBlock.gif        Key otherKey 
=  (Key) other;
InBlock.gif        
return  otherKey.identifierSpace.equals( this .identifierSpace)  &&  otherKey.identifier.equals( this .identifier);
ExpandedBlockEnd.gif    }

None.gif    
ExpandedBlockStart.gifContractedBlock.gif    
public   int  hashCode()  dot.gif
InBlock.gif        
int  result  =   17 ;
InBlock.gif        result 
=   37   *  result  +  identifierSpace.hashCode();
InBlock.gif        result 
=   37   *  result  +  identifier.hashCode();

这个Key在hiberante几个版本都一样
但在ClassPersister在2.1.6和2.1.7却有不同:
hibernate 2.1.7中在AbstractEntityPersister中

ExpandedBlockStart.gifContractedBlock.gifpublic  Serializable getIdentifierSpace()  dot.gif {
InBlock.gif    
return  rootClassName;
ExpandedBlockEnd.gif}

但在hibernate 2.1.6 中的EntityPersister

ExpandedBlockStart.gifContractedBlock.gif  public  Serializable getIdentifierSpace()  dot.gif {
InBlock.gif  
return  qualifiedTableName;
ExpandedBlockEnd.gif }

问题就出在这里。赶紧把hibernate从2.1.6升级到2.1.8。

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化与数据处理的自动化,以提升日常教学管理工作的效率与准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程与成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批与教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划与资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课与成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值