在 Hibernate 中使用 SessionFactory.getCurrentSession() 获取连接对象
Get Connection object while using SessionFactory.getCurrentSession() in Hibernate
我试图在使用 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
在 Hibenate 5 中,我们需要做一些不同的事情(有关更多详细信息,请查看 https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html):
import java.sql.Connection;
import java.sql.SQLException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.Metadata;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.jdbc.Work;
public class Htest {
public static void main(String ... args) throws SQLException {
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml")
.build();
Metadata metadata = new MetadataSources( standardRegistry )
.addAnnotatedClass(TesEntity.class)
.buildMetadata();
SessionFactory sessionFactory = metadata.getSessionFactoryBuilder()
.build();
//one way to get connection version 5.0.2
Connection c = sessionFactory.
getSessionFactoryOptions().getServiceRegistry().
getService(ConnectionProvider.class).getConnection();
Session sess = null;
try {
sess = sessionFactory.getCurrentSession();
} catch (org.hibernate.HibernateException he) {
sess = sessionFactory.openSession();
}
//If you are using latest version 5.2.3 you can use this line below
//Connection c = ((SessionImpl)sess.getSession()).connection();
System.out.println(c.getMetaData().getDatabaseProductName());
//another way to get connection
sess.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
//connection accessible here
System.out.println(connection.getMetaData().getDatabaseProductName());
}
});
}
}
如果你想测试代码,我对 derby db 的配置。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
<property name="hibernate.connection.url">jdbc:derby://localhost:1527/mytest;create=fasle</property>
<!-- <property name="connection.username"/> -->
<!-- <property name="connection.password"/> -->
<!-- DB schema will be updated if needed -->
<!-- <property name="hbm2ddl.auto">update</property> -->
</session-factory>
</hibernate-configuration>
此应用程序的输出:
我试图在使用 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
在 Hibenate 5 中,我们需要做一些不同的事情(有关更多详细信息,请查看 https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html):
import java.sql.Connection;
import java.sql.SQLException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.Metadata;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.jdbc.Work;
public class Htest {
public static void main(String ... args) throws SQLException {
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml")
.build();
Metadata metadata = new MetadataSources( standardRegistry )
.addAnnotatedClass(TesEntity.class)
.buildMetadata();
SessionFactory sessionFactory = metadata.getSessionFactoryBuilder()
.build();
//one way to get connection version 5.0.2
Connection c = sessionFactory.
getSessionFactoryOptions().getServiceRegistry().
getService(ConnectionProvider.class).getConnection();
Session sess = null;
try {
sess = sessionFactory.getCurrentSession();
} catch (org.hibernate.HibernateException he) {
sess = sessionFactory.openSession();
}
//If you are using latest version 5.2.3 you can use this line below
//Connection c = ((SessionImpl)sess.getSession()).connection();
System.out.println(c.getMetaData().getDatabaseProductName());
//another way to get connection
sess.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
//connection accessible here
System.out.println(connection.getMetaData().getDatabaseProductName());
}
});
}
}
如果你想测试代码,我对 derby db 的配置。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
<property name="hibernate.connection.url">jdbc:derby://localhost:1527/mytest;create=fasle</property>
<!-- <property name="connection.username"/> -->
<!-- <property name="connection.password"/> -->
<!-- DB schema will be updated if needed -->
<!-- <property name="hbm2ddl.auto">update</property> -->
</session-factory>
</hibernate-configuration>
此应用程序的输出: