我有以下结构:
我没有配置数据源,我使用像它一样的动态数据源配置:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persitenceUnit", createMap(ds));
'ds'是具有我的数据库属性的对象,如user,password,url,...
我这样得到了Entitymanager:
EntityManager em = emf.createEntityManager();
我尝试以这种方式获得连接:
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);
但是不要工作。
答案 0 :(得分:0)
如果升级到最新的c3p0-0.9.5 prerelease版本,unwrap()方法将起作用。 unwrap()是一个JDBC4方法,c3p0从c3p0-0.9.5开始支持。由于您需要OracleCallableStatement,因此您可能需要调用CallableStatement的unwrap()方法,而不是上面尝试的Connection的unwrap()方法。
或者(更安全一点),几乎任何版本的库,都可以使用c3p0的原始语句操作。 See the docs