用hibernate+spring处理Blob时报错:"Could not create Oracle LOB"

fuwang 2006-06-29 01:16:33
数据源用的commons dbcp.

已经配置了
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true">
</bean>
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor"/>
</property>
</bean>

<!--Hibernate SessionFatory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="lobHandler" ref="lobHandler"/>
</bean>

大对象在POJO中为 private byte[] content;

在它的hbm配置文件中为:
<property name="content" type="org.springframework.orm.hibernate3.support.BlobByteArrayType" lazy="true">
<column name="CONTENT" />
</property>

新增的方法为:
getHibernateTemplate().save(obj);

结果报这个异常:
org.springframework.dao.DataAccessResourceFailureException: Could not create Oracle LOB; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: OracleLobCreator needs to work on [oracle.jdbc.OracleConnection], not on [class oracle.jdbc.driver.OracleConnection] - specify a corresponding NativeJdbcExtractor
...全文
1005 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
c366oem 2006-07-03
  • 打赏
  • 举报
回复
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="lobHandler">
<ref local="oracleLobHandler" />
</property>
<property name="mappingResources">
<list>...</list>
</property>
<property name="hibernateProperties">...</property>
</bean>


<bean id="oracleLobHandler"
class="org.springframework.jdbc.support.lob.OracleLobHandler"
lazy-init="true">
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor" />
</property>
</bean>


<!--使用dbcp连接池时启用-->
<bean id="nativeJdbcExtractor"
class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"
lazy-init="true" />


然后JavaBean里面是blob的字段要定义成 byte[] 然后就ok了.驱动当然最好推荐用oracle10的驱动.


gyscsdn 2006-07-03
  • 打赏
  • 举报
回复
up
Saro 2006-06-30
  • 打赏
  • 举报
回复
看了看相关的源码,
这是CommonsDbcpNativeJdbcExtractor的实现:
protected Connection doGetNativeConnection(Connection con) throws SQLException {
if (con instanceof DelegatingConnection) {
Connection nativeCon = ((DelegatingConnection) con).getInnermostDelegate();
// For some reason, the innermost delegate can be <code>null</code>: not for a
// Statement's Connection but for the Connection handle returned by the pool.
// We'll fall back to the MetaData's Connection in this case, which is
// a native unwrapped Connection with Commons DBCP 1.1 and 1.2.
return (nativeCon != null ? nativeCon : con.getMetaData().getConnection());
}
return con;
}

这是C3P0NativeJdbcExtractor的实现:
protected Connection doGetNativeConnection(Connection con) throws SQLException {
if (con instanceof C3P0ProxyConnection) {
C3P0ProxyConnection cpCon = (C3P0ProxyConnection) con;
try {
return (Connection) cpCon.rawConnectionOperation(
this.getRawConnectionMethod, null, new Object[] {C3P0ProxyConnection.RAW_CONNECTION});
}
catch (Exception ex) {
throw new DataAccessResourceFailureException("Could not retrieve C3P0's raw connection", ex);
}
}
return con;
}



我想,自己实现一个NativeJdbcExtractor,根据你的oracle driver来实现doGetNativeConnection方法,返回一个oracle.jdbc.driver.OracleConnection应该就可以了。
fuwang 2006-06-29
  • 打赏
  • 举报
回复
Comment by Juergen Hoeller [02/Oct/05 04:41 PM]
This is likely to be caused by a class loader issue: that is, the Oracle JDBC driver classes being available from multiple class loaders.

Spring's OracleLobHandler used a locally loaded OracleConnection class to check whether the given Connection handle is actually an Oracle JDBC connection. That might fail if the locally loaded OracleConnection class is not the same as the one used at the server level.

Consequently, we've relaxed that check to accept any kind of Connection handle. If a ClassCastException arises within the Oracle driver's BLOB/CLOB handling (a sign of a non-OracleConnection passed in), we throw an expressive exception that indicates to specify a correct NativeJdbcExtractor.

Essentially, it's a post-invocation check rather than a pre-invocation check now, which should avoid any potential class loader issues.

This change should be available in Monday night's nightly Spring snapshot. Please give it a try and let us know whether it works for you!

Juergen


上面是从网上找的,没怎么看明白.
fuwang 2006-06-29
  • 打赏
  • 举报
回复
我看到 oracle9.2.0.3.0的ojdbc.jar里既有oracle.jdbc.OracleConnection,也有oracle.jdbc.driver.OracleConnection,怎么回事?
fuwang 2006-06-29
  • 打赏
  • 举报
回复
我换为ojdbc14.jar,还是不行.
环境:tomcat5.0.28,dbcp, oracle9.2.0.3.0,hibernate3.0.5,spring1.2.5
pigo 2006-06-29
  • 打赏
  • 举报
回复

Oracle的jdbc必须是ojdbc14.jar,Oracle的版本必须是9.0.2及以上。

Saro 2006-06-29
  • 打赏
  • 举报
回复
Oracle驱动的版本问题,根据你自己的oracle及driver的版本改写org.springframework.jdbc.support.lob.OracleLobHandler
kevinliuu 2006-06-29
  • 打赏
  • 举报
回复
OracleLobCreator needs to work on [oracle.jdbc.OracleConnection], not on [class oracle.jdbc.driver.OracleConnection]

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧