我有以下结构:
- 使用 Hibernate 4.0.1 的层,使用 C3P0 作为连接池。
我没有配置数据源,我使用像这样的数据源动态配置:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persitenceUnit", createMap(ds));
“ds”是一个具有我的数据库属性的对象,例如用户、密码、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);
但是不起作用。
最佳答案
如果您升级到最新版本 c3p0-0.9.5 prerelease,unwrap() 方法将起作用。版本。 unwrap() 是一种 JDBC4 方法,从 c3p0-0.9.5 开始受 c3p0 支持。由于您需要 OracleCallableStatement,因此您可能需要调用 CallableStatement 的 unwrap() 方法,而不是像上面尝试的那样调用 Connection 的 unwrap() 方法。
或者(更安全一点),对于几乎任何版本的库,您都可以使用 c3p0 的原始语句操作。 See the docs .
关于java - 从 NewProxyConnection 中解开 NewProxyConnection 和 GetConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19296410/