1

我有以下结构:

  1. Hibernate 4.0.1 的一个层,使用 C3P0 作为连接池。
  2. 我没有配置数据源,我使用像这样的数据源动态配置:

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("persitenceUnit", createMap(ds)); 
    

'ds' 是一个具有我的数据库属性的对象,例如用户、密码、url ......

  1. 我以这种方式获得 Entitymanager:

    EntityManager em = emf.createEntityManager();
    
  2. 我尝试以这种方式获得连接:

    EntityManagerImpl entityManagerImpl = (EntityManagerImpl)em;
    SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl)entityManagerImpl.getSession().getSessionFactory();
    Connection con = sessionFactoryImpl.getConnectionProvider().getConnection();
    

但是, con 是一个 NewProxyConnection 实例。我需要执行一个返回 ORAData 并con.prepareCall(sqlToProcedure)返回没有 getOraData 的 NewProxyCallableStatment 的过程,即此代码不起作用:

OracleCallableStatment ocs = (OracleCallableStatment)con.prepareCall('{call stp_test(?)}');   
ocs.excute();    
TestObjectodf to = ocs.getOraDATA(1, TestObject.getOraDataFactory());    

错误发生在

OracleCallableStatment ocs = (OracleCallableStatment)con.prepareCall('{call stp_test(?)}');

我尝试:

NewProxyConnection npCon = sessionFactoryImpl.getConnectionProvider().getConnection();
Connection con = npCon.unwrap(Connection.class);

但不要工作。

4

1 回答 1

0

如果您升级到最新的c3p0-0.9.5 预发布版本,则 unwrap() 方法将起作用。unwrap() 是一种 JDBC4 方法,自 c3p0-0.9.5 起由 c3p0 支持。由于您需要 OracleCallableStatement,因此您可能希望调用 CallableStatement 的 unwrap() 方法,而不是 Connection 的 unwrap() 方法,正如您在上面尝试的那样。

或者(更安全一点),对于几乎任何版本的库,您都可以使用 c3p0 的原始语句操作。请参阅文档

于 2013-10-12T06:13:44.060 回答