我正在開發一個由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交換它似乎不是個好主意。