2013-01-03 34 views
1

我正在开发一个由tomcat上的hibernate支持的JPA应用程序。我们也使用Spring和AOP。该数据库是一个DB2 9.7社区版本。我们使用Spring JNDI查找从tomcat中检索数据源。Tomcat上的AbstractMethodError setBinaryStream

这是一个与Liferay门户捆绑在一起的tomcat 6.0.26。更新tomcat不是一个选项,因为我们在将Liferay升级到更新的版本/软件包时遇到问题。

持久化在我们的测试用例中运行良好,但是对于tomcat我们得到以下异常。该应用程序运行良好,直到我想要存储附件。

Caused by: java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) 
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
at $Proxy432.setBinaryStream(Unknown Source) 
at org.hibernate.type.descriptor.sql.BlobTypeDescriptor$4$1.doBind(BlobTypeDescriptor.java:163) 

综观其他问题Why do I get java.lang.AbstractMethodError when trying to load a blob in the db?这个问题似乎是使用JDBC3驱动器,而不是jdbc4司机。但是,我确信我们有正确的DB2驱动程序版本“db2jcc4.jar 4.14.113”。相同的驱动程序适用于我们的测试用例。

当人们在别处搜索时,问题在于setBinaryStream是用long而不是int来调用的,但是因为我不直接调用任何东西,所以我不能改变它。

有问题的实体:

@Table(name = "ATTACHMENT") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(namespace = "somenamespace", name = "Attachment") 
public class Attachment implements Serializable { 
    private static final long serialVersionUID = 1L; 

    /** 
    */ 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID", nullable = false) 
    @Basic(fetch = FetchType.EAGER) 
    @Id 
    @XmlElement 
    Integer id; 
    /** 
    */ 

    @Column(name = "ATTACHMENT", nullable = false) 
    @Basic(fetch = FetchType.EAGER) 
    @Lob 
    @XmlElement 
    byte[] attachment; 

     .. getters/setters and other properties 
} 

可以做些什么,以便它保存实体象在测试用例来规避这个问题?

更新:可能不是db驱动程序本身,但tomcat连接池不符合JDBC4。 Tomcat 6 documentation表示“DBCP 1.3提供了对JDBC 3.0的支持”。当看到tomcat-dbcp vs commons-dbcp时,用纯dbcp交换它似乎不是个好主意。

回答

1

经过一段时间,我找到了解决方案。

我下载了tomcat 7并复制了tomcat-dbcp。

tomcat-dbcp 7包含dbcp 1.4并提供JDBC 4.0支持。

相关问题