java - 从 NewProxyConnection 中解开 NewProxyConnection 和 GetConnection

标签 java entitymanager c3p0

我有以下结构:

  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);

但是不起作用。

最佳答案

如果您升级到最新版本 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/

相关文章:

java - JPA 2 - 在 JavaSE 中使用 EntityManager - 几个问题

Symfony 3 - 具有多个数据库连接的 EntityManager 依赖注入(inject)

java - 无法让 Darkula 在 Netbeans 中以外观和感觉工作

java - 自定义 View android中的抽象类实例化错误

java - EntityManager 生命周期和持续的客户端-服务器-通信

mysql - vert.x async jdbc 不会关闭连接

mysql - Hibernate、c3p0 和 Mysql、spring

java - JPA2 Criteria 重音不敏感,不依赖数据库

java - 使用 takeWhileWithIndex 迭代索引数组,然后发出可观察值

java - 如何在我的 hibernate 类中启用 c3p0 日志记录