2012-05-30 25 views
0

我无法找到一种方法来处理我认为是常见的任务。使用休眠和c3p0连接池从Java应用程序调用Oracle存储过程

我已经

CREATE TYPE MyType AS OBJECT (field1 int, field2 int); 
CREATE PROCEDURE SP_TEST (obj IN MyType) AS ....  

我怎样才能从Java调用应用这个程序?我使用隐藏原生jdbc连接的hibernate和c3p0连接池,因此我无法将其代理连接转换为OracleConnection。我发现c3p0有rawConnectionOperation,但我不明白如何使用它来完成我的任务。

任何帮助是极大的赞赏

回答

0

万一有人有类似的问题,是可以解决这样的:

public class CallSPTest 
{ 
    public static STRUCT createSTRUCT(oracle.sql.StructDescriptor structDescriptor, 
    java.sql.Connection connection, java.lang.Object[] objects) 
    throws java.sql.SQLException 
    { 
     return new STRUCT(structDescriptor,connection,objects); 
    } 
    public void testSP(Session s) 
    { 
     t = s.beginTransaction(); 
     s.doWork(new Work() 
     { 

      @Override 
      public void execute(Connection connection) throws SQLException 
      { 
       try 
       { 
        CallableStatement cs = connection.prepareCall("call SP_TEST(?)");      
        final Object[] values = new Object[]{1,2}; 

        java.sql.Connection connect = 
    org.hibernate.jdbc.BorrowedConnectionProxy.getWrappedConnection(connection); 
        C3P0ProxyConnection castCon = (C3P0ProxyConnection) connect; 
        Method m = StructDescriptor.class.getMethod("createDescriptor", new Class[]{ String.class,Connection.class}); 
        Object[] args = new Object[]{"MyType",C3P0ProxyConnection.RAW_CONNECTION}; 
        StructDescriptor desc1 =(StructDescriptor) castCon.rawConnectionOperation(m, null, args); 

        Method m2 = CallSPTest.class.getMethod("createSTRUCT", 
          new Class[]{StructDescriptor.class, Connection.class,Object[].class}); 

        args = new Object[] {desc1,C3P0ProxyConnection.RAW_CONNECTION,values}; 
        final STRUCT struct1 = (STRUCT)castCon.rawConnectionOperation(m2,null,args); 
        cs.setObject(1, struct1, Types.STRUCT); 
        int aff_rows = cs.executeUpdate(); 
       } 
       catch (Exception e) 
       { 
        System.out.print(e.getMessage()); 
       } 
      } 
     }); 
    } 
    catch (Exception e) 
    { 
     System.out.print(e.getMessage()); 
    } 
    finally 
    { 
     if (null != t) 
     { 
      t.rollback();     
     } 
    } 

} 
0

如果你可以在SQL提示符下执行它,你可以用

session.createSQLQuery("exec SP_TEST([yourargs]"); 

我不熟悉甲骨文的自定义类型做,在休眠,但使用相同的您将在查询中使用的语法。

+0

问题是与参数。为了正确地分配它们,我必须使用'oracle.sql'包(STRUCT,StructDescriptor)中的类,它只能与'OracleConnection'一起工作,但c3p0代理连接不能转换为'OracleConnection',这看起来像是一个恶性循环。 – a1ex07