首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用hibernate和c3p0连接池从Java App调用Oracle存储过程

使用hibernate和c3p0连接池从Java App调用Oracle存储过程
EN

Stack Overflow用户
提问于 2012-05-30 23:10:43
回答 2查看 3.9K关注 0票数 0

我找不到一种方法来做一些对我来说似乎是一项常见的任务。

我有过

代码语言:javascript
复制
CREATE TYPE MyType AS OBJECT (field1 int, field2 int);
CREATE PROCEDURE SP_TEST (obj IN MyType) AS ....    

如何从Java应用程序调用此过程?我使用的是hibernate和隐藏了原生c3p0连接的jdbc连接池,所以我不能将它的代理连接转换为OracleConnection。我发现c3p0有rawConnectionOperation,但我不知道如何使用它来完成我的任务。

非常感谢您的任何帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-31 01:38:39

如果有人有类似的问题,可以像这样解决:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-05-30 23:40:39

如果您可以在SQL提示符中执行此操作,则可以在Hibernate中使用

代码语言:javascript
复制
session.createSQLQuery("exec SP_TEST([yourargs]");

我不熟悉Oracle中的自定义类型,但使用的语法与查询中使用的语法相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10819104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档