【发布时间】:2017-05-02 04:34:01
【问题描述】:
当使用 SessionFactory.getCurrentSession() 时,我试图在 Hibernate 中获取 Connection 对象。
源代码
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.internal.SessionImpl;
public class SOExample {
public static void main(String[] args) throws SQLException {
Configuration configuration = new Configuration();
SessionFactory sessionFactory = configuration.buildSessionFactory(new StandardServiceRegistryBuilder().configure().build());
Session session = sessionFactory.getCurrentSession();
Connection connection = ((SessionImpl) session).connection();
// doing operation on connection object as per my requirement
DatabaseMetaData databaseMetaData = connection.getMetaData();
System.out.println(databaseMetaData.getDatabaseProductName());
}
}
堆栈跟踪
Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy24 cannot be cast to org.hibernate.internal.SessionImpl
at com.SOExample.main(SOExample.java:20)
getCurrentSession() 给出Session 的Proxy 对象,所以它不能将它转换为SessionImpl 那么还有什么其他方法可以得到Connection 对象。或者如何从代理对象SessionImpl。
我尝试了其他选项,但它显示getConnectionProvider() 方法未找到。
SessionFactoryImplementor sessionFactoryImplementation = (SessionFactoryImplementor) session.getSessionFactory();
ConnectionProvider connectionProvider = sessionFactoryImplementation.getConnectionProvider();
try {
Connection connection = connectionProvider.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
注意:我使用的是hibernate-core-5.0.5.Final.jar
【问题讨论】:
标签: java hibernate hibernate-4.x hibernate-5.x