2012-11-07 20 views
-1

這是一個後續Executing native query with Hibernate 4.1獲得一個句柄在Hibernate中4本地Oracle連接來運行一個存儲過程

我試着在上市答案的選項,但我們得到的錯誤,無法解開的代理連接到其中的Oracle需要

選項2代碼的本機連接

public void execute(Connection connection) throws SQLException { 
    OracleConnection oracleConnection = connection.unwrap(OracleConnection.class); 
    ... 
} 

錯誤

java.lang.reflect.UndeclaredThrowableException 
ERROR [stderr] (http-localhost/127.0.0.1:8080-3) at $Proxy64.unwrap(Unknown Source) 

選擇3碼

public void execute(Connection connection) throws SQLException { 
    Connection unproxiedConnection = ((JdbcWrapper<Connection>) connection).getWrappedObject(); 
    ... 
} 

錯誤

java.lang.ClassCastException: org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6 cannot be cast to oracle.jdbc.OracleConnection 
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:158) [ojdbc6.jar:11.2.0.1.0] 
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:126) [ojdbc6.jar:11.2.0.1.0] 
at com.xxx.massBookingUpdateParam(HoldoversDAO.java:312) [Business-1.jar:] 
at com.xxx.saveHoldovers(HoldoversServiceBean.java:86) [Business-1.jar:] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0] 
at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0] 
at org.jboss.as.ee.component.ManagedReferenceMethodInterceptorFactory$ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptorFactory.java:72) [jboss-as-ee-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:374) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:129) [jboss-as-weld-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:137) [jboss-as-weld-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:36) [jboss-as-ee-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:36) [jboss-as-ee-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43) [jboss-as-ejb3-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47) [jboss-as-jpa-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:74) [jboss-as-weld-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:53) [jboss-as-ee-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:51) [jboss-as-ejb3-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final-redhat-1.jar:1.1.1.Final-redhat-1] 
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:227) [jboss-as-ejb3-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
... 71 more 

有什麼建議?

我也試過這個選項SessionFactory.openSession(Connection) in Hibernate 4但該類沒有得到根本

更新實例:

選項2的代碼工作正常。問題是我們有兩個版本的ojbc.jar - 一個是Jboss模塊,另一個是EAR,因此是Exception。

+0

爲什麼你的「選擇3碼」會導致錯誤?您從不嘗試將連接轉換爲Oracle連接。一般來說,您需要了解連接池和數據源通常也會「包裝」連接。至於「選項2代碼」,Hibernate會將該調用委託給它所具有的底層連接。但是這是導致錯誤。所以在那個Connection的解包方法中存在錯誤。我假設這是JBoss WrappedConnectionJDK6類。 –

+0

您是否擁有選項2的完整堆棧跟蹤? –

+0

@Steve Ebersole:我們通過這個'oracle.jdbc.driver.OracleConnection oc =(oracle.jdbc.driver.OracleConnection)connection.getMetaData()獲得了。getConnection();' – JoseK

回答

0

選項2代碼正常工作。

即。

OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);

的問題是,我們有2個版本ojbc.jar的 - 一個作爲一個JBoss模塊和一個EAR中,因此ClassCastException異常。

正如評論所說,這種代碼也可以

oracle.jdbc.driver.OracleConnection oc = (oracle.jdbc.driver.OracleConnection) connection.getMetaData().getConnection();

0

請嘗試以下

我曾遇到同樣的問題。我們使用的是Spring,它有一個名爲 NativeJdbcExtractor的類。它有很多實現,下面的實現對TomCat有效。有一個具體的實施對於JBoss稱爲JBossNativeJdbcExtractor

<bean id="jdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"></bean> 

在你的DAO,你可以注入豆,並使用以下方法

protected NativeJdbcExtractor jdbcExtractor; 
Connection conn=jdbcExtractor.getNativeConnection(oracleConnection); 
相關問題