【发布时间】:2011-12-20 21:57:13
【问题描述】:
我的数据库使用 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 系统属性)。为什么我上面的例子不起作用?
【问题讨论】:
-
不确定 Spring 的 HibernateTemplate 是如何发挥作用的,但请尝试
Connection#unwrap()。 -
这样做要非常小心。 “原始” JDBC 连接通常位于几个不同的类层下,这些类都实现了连接。最常见的情况是连接池将添加的层,这样当您“关闭”连接时,您真正要做的就是将其返回到池中。如果您对这些层之一正在跟踪的原始连接进行某些操作,则可能会出现问题。绝对确定你需要这样做,而不是通过其他方式实现目标。
-
@BalusC - 好主意。我试过了,但是我的 Apache DBCP 连接池程序版本没有实现 unwrap 方法。当我尝试它时,我得到了以下异常: java.lang.AbstractMethodError: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.unwrap(Ljava/lang/ClassLjava/lang/Object;
-
@rfeak - 我只是想读取 MySQL allowNanAndInf 属性的值(它确定双字段中是否允许 NaN 值)。我不打算对供应商 MySQL Connection 对象执行任何查询或插入/更新。
-
DBCP 确实不符合 JDBC4。好吧,如果可以,请更换它。无论如何,这是一个可怕的游泳池。另见stackoverflow.com/questions/520585/…