使用hibernate和c3p0连接池从Java应用程序调用Oracle存储过程
我找不到一种方法来做一些我认为是普通任务的事情 我有使用hibernate和c3p0连接池从Java应用程序调用Oracle存储过程,java,oracle,hibernate,Java,Oracle,Hibernate,我找不到一种方法来做一些我认为是普通任务的事情 我有 CREATE TYPE MyType AS OBJECT (field1 int, field2 int); CREATE PROCEDURE SP_TEST (obj IN MyType) AS .... 如何从Java应用程序调用此过程?我正在使用hibernate和c3p0连接池来隐藏本机jdbc连接,因此无法将其代理连接强制转换为OracleConnection。我发现c3p0具有rawConnectionOperation
CREATE TYPE MyType AS OBJECT (field1 int, field2 int);
CREATE PROCEDURE SP_TEST (obj IN MyType) AS ....
如何从Java应用程序调用此过程?我正在使用hibernate和c3p0连接池来隐藏本机jdbc连接,因此无法将其代理连接强制转换为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();
}
}
}
问题在于争论。为了正确地分配它们,我必须使用来自
oracle.sql
包(STRUCT,StructDescriptor)的类,这些类只能与OracleConnection
一起工作,但c3p0代理连接不能转换为OracleConnection
,这在我看来是一个恶性循环。