【发布时间】:2012-12-17 23:10:13
【问题描述】:
我正在tomcat 上开发一个由hibernate 支持的JPA 应用程序。我们也在使用 Spring 和 AOP。该数据库是 DB2 9.7 社区版。我们正在使用 Spring JNDI 查找从 tomcat 检索数据源。
这是一个与 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 交换它似乎不是一个好主意。
【问题讨论】:
标签: java tomcat jpa tomcat6 jndi