将java.sql.Connection转换为com.mysql.jdbc.Connection

时间:2011-12-20 21:57:14

标签: java hibernate casting

我的数据库使用MySQL,我使用hibernate作为ORM框架。我有一个实例需要访问MySQL Connection对象。我使用以下代码来获取java.sql.Connection对象:

getHibernateTemplate().getSessionFactory().getCurrentSession().connection();

但是,当我尝试将其强制转换为(com.mysql.jdbc.Connection)对象时,我得到以下异常:

java.lang.ClassCastException: $Proxy50 cannot be cast to com.mysql.jdbc.Connection

奇怪的是,如果我做conn.getClass().getName(),返回的类类型是'$ Proxy50'而不是'java.sql.Connection'或其他一些有意义的类型。

从Hibernate获取供应商特定Connection对象的正确方法是什么? (我正在尝试读取MySQL系统属性)。为什么上面的例子不起作用?

3 个答案:

答案 0 :(得分:1)

通常,您不需要访问具体的Connection实现。

但如果你真的,真的需要,这里有一个解释:$ Proxy40意味着它是一个JDK动态代理。 Spring倾向于创造这些。如果你的是春天创造的,那么你可以通过以下方式获得真实的物体:

Advised advised = (Advised) connection;
Connection conn = (Connection) advised.getTargetSource().getTarget();

如果代理中没有参与spring,你应该能够像BalusC建议的那样打电话给Connection.unwrap(..)(你应该能够这样做)

答案 1 :(得分:0)

  

获取供应商特定连接的正确方法是什么   来自Hibernate的对象?

取决于。

我已经像这样成功解开了Proxy。 How to unwrap the original object from a dynamic proxy

但是,有点可怕的东西,如果可以,请避免使用它。

答案 2 :(得分:0)

com.mysql.jdbc.Connection实现java.sql.Connection接口。因此,当您创建com.mysql.jdbc.Connection对象时,也是java.sql.Connection对象。所以你不能在那里进行操作,因为返回的对象是java.sql.Connection而不是com.mysql.jdbc.Connection