簡體   English   中英

使用休眠和c3p0連接池從Java App調用Oracle存儲過程

[英]Call Oracle stored procedure from Java App using hibernate and c3p0 connection pool

我無法找到一種方法來完成我認為是常見任務的工作。

我有

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

如何從Java應用程序調用此過程? 我正在使用隱藏本機jdbc連接的hibernate和c3p0連接池,因此無法將其代理連接轉換為OracleConnection。 我發現c3p0具有rawConnectionOperation,但是我不知道如何使用它來完成任務。

任何幫助是極大的贊賞

如果您可以在SQL提示中執行此操作,則可以在Hibernate中執行以下操作

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

我不熟悉Oracle中的自定義類型,但是使用的查詢語法與查詢中使用的語法相同。

如果有人遇到類似問題,可以通過以下方式解決:

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();                
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM