我的数据库使用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系统属性)。为什么上面的例子不起作用?
答案 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
。