从NewProxyConnection展开NewProxyConnection和GetConnection

时间:2013-10-10 12:58:36

标签: java entitymanager c3p0

我有以下结构:

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

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("persitenceUnit", createMap(ds)); 
    
  3. 'ds'是具有我的数据库属性的对象,如user,password,url,...

    1. 我这样得到了Entitymanager:

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

      EntityManagerImpl entityManagerImpl = (EntityManagerImpl)em;
      SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl)entityManagerImpl.getSession().getSessionFactory();
      Connection con = sessionFactoryImpl.getConnectionProvider().getConnection();
      
    3. 但是,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);
      

      但是不要工作。

1 个答案:

答案 0 :(得分:0)

如果升级到最新的c3p0-0.9.5 prerelease版本,unwrap()方法将起作用。 unwrap()是一个JDBC4方法,c3p0从c3p0-0.9.5开始支持。由于您需要OracleCallableStatement,因此您可能需要调用CallableStatement的unwrap()方法,而不是上面尝试的Connection的unwrap()方法。

或者(更安全一点),几乎任何版本的库,都可以使用c3p0的原始语句操作。 See the docs