.
.
.
.
.
今天在做Hibernate和Spring整合,在一张表中多添加了三个字段,它们的类型分别是INT、BIT和DATETIME,然后手动修改了实体类和.hbm.xml,启动单元测试的时候遇到了一个问题,控制台上报出了一大堆异常和堆栈信息,嵌套到最终的一个异常是Unable to instantiate default tuplizer,于是开始在Google上查相关资料,查了很久,查出了几种可能导致该异常的方法,于是将其记录下来,分享给遇到同样问题的网友。
第一种可能是缺少javassist.jar包,下面给出下载地址。
http://mirrors.ibiblio.org/pub/mirrors/maven/javassist/jars/javassist-3.0.jar
第二种可能是hibernate.cfg.xml的mapping配置错误,仔细检查这个文件,把有错误的先注释掉再试试。
第三种可能是某个实体类中外加了某些getXX(),而不存在XX属性,这时要在get上加@Transient,不持久化它就行了。或者是实体表或映射表中属性写的不一致导致的,所以要细心检查实体类、.hbm.xml和数据库之间的属性名、字段名还有类型是否写错了。
结果我按照上面三种情况都做了检查也没有发现问题,最后发现了一个问题:那个BIT字段的属性名有点特殊,private Boolean isInvalid;,结果在设置getter()方法和setter()方法时被MyEclipse自动生成为下面这种形式:
1 public Boolean isInvalid() {
2 return isInvalid;
3 }
4
5 public void isInvalid(Boolean isInvalid) {
6 this.isInvalid = isInvalid;
7 }
把它们改成以下的形式就好了:
1 public Boolean getIsInvalid() {
2 return isInvalid;
3 }
4
5 public void setIsInvalid(Boolean isInvalid) {
6 this.isInvalid = isInvalid;
7 }
所以命名的时候一定要谨慎,尤其对于Boolean类型的属性更要谨慎!