【发布时间】:2013-02-08 11:19:10
【问题描述】:
Hibernate 4 使用 jdbc4,将方法 setBinaryStream(int, InputStream, int) 的签名更改为 setBinaryStream(int, InputStream, long)。 C3P0 不支持这种新方法。
所以调用 saveOrUpdate(myObjWithBlob) 结果
java.lang.AbstractMethodError: com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.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 $Proxy75.setBinaryStream(Unknown Source)
那我现在能做什么?
1) 不要使用 c3p0。 DHCP、BoneCP 或根本没有连接池。 - 不是我真正想要的选项。
2) 不知何故让休眠避免调用这个新方法?有可能吗?
3) 切换回休眠 3 - 对我来说也不是很好。
【问题讨论】:
-
我不相信#2 是可能的。至于 #1,如果您使用其中任何一个 Web 服务器,Tomcat 7 和 JBoss 7 中也有本机连接池。
-
在某个时间点,Hibernate 4 似乎应该支持 JDBC 3,但我无法弄清楚如何做到这一点:community.jboss.org/wiki/JDBC4Support
-
此外,如果您避免使用 blob,您似乎可以避免使用此方法。不确定这是否是一个选项。
-
最后但同样重要的是,您可以按照此处的建议自行编译 C3P0:hibernate.onjira.com/browse/HHH-7801
-
hm...Hibernate 的默认连接池破坏了 saveOrUpdate 之类的基本功能,这似乎很奇怪...希望以后能修复它。