首先描述一下本问题吧,此问题其实就是用户定义的Hibernate中的字段类型与Oracle中自带的类的数据操作类型相冲突。
比如:
1、在vo中java文件声明类似如下,
private Blob messageBody;
public Blob getMessageBody() {
return this.messageBody;
}
public void setMessageBody(Blob messageBody) {
this.messageBody = messageBody;
}
2、Hibernate中X.hbm.xml中定义为:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.mail.vo.Spool" table="SPOOL" schema="EJMAIL">
<composite-id name="id" class="com.mail.vo.SpoolId">
........
.........
<property name="messageBody" type="java.sql.Blob">
<column name="MESSAGE_BODY" not-null="true" />
</property>
</class>
</hibernate-mapping>
这样,在1、2中就可以形成一种映射,这个是没问题的,然而,问题的关键就在于,当我们要在其他类中操作我们的表时,有时会遇到这样的异常“java.lang.AbstractMethodError: oracle.jdbc.driver.OracleResultSetImpl.getBlob(Ljava/lang/String;)Ljava/sql/Blob;”,例如:以下这个类,
package com.mail.struts.action;
import java.util.List;
......
......
public class LoginAction extends Action {
......
......
public LoginAction() {
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
HttpSession httpSession = request.getSession();
SpoolDAOImpl spoolDAOImpl = new SpoolDAOImpl();
String forward = null;
try {
list = spoolDAOImpl.findAll();
} catch (Exception e) {
e.printStackTrace();
}
.....
......
return mapping.findForward(forward);
当执行红色字体的代码时,系统调用Oracle驱动中的oracle.jdbc.driver.OracleResultSetImpl.getBlob(String)方法,此方法在不同版本的定义不一样,最新版本的定义可以是oracle.jdbc.driver.OracleResultSetImpl.getBlob(Blob),如果你的驱动是相对较低版本的,有可能产生方法参数类型不兼容的异常,解决方法就是在网上找个新的驱动替换掉原来的那个旧版本的。
最新驱动下载http://download.youkuaiyun.com/source/807689:
如果还不能解决问题,可以加Q:244678184