2016-12-16 102 views
2

我试图在使用SessionFactory.getCurrentSession()时在Hibernate中获取Connection对象。在休眠状态下使用SessionFactory.getCurrentSession()时获取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()给出SessionProxy对象,因此它不能将它转换为SessionImpl那么什么是其他方式获得Connection对象。或如何从代理对象SessionImpl


其他选项我试过但说getConnectionProvider()找不到方法。

SessionFactoryImplementor sessionFactoryImplementation = (SessionFactoryImplementor) session.getSessionFactory(); 
ConnectionProvider connectionProvider = sessionFactoryImplementation.getConnectionProvider(); 
try { 
    Connection connection = connectionProvider.getConnection(); 
} catch (SQLException e) { 
    e.printStackTrace(); 
} 

注意:我使用休眠核心 - 5.0.5.Final.jar

回答

7

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()); 
      } 
     }); 
    } 
} 

我对德比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> 

输出这个应用程序的:

enter image description here

+0

有没有其他办法?我希望它分开,因为我在其他类和方法中传递该对象。 –

+0

我已经更新了代码。请检查一下这个解决方案是否可以接受。 –

+0

没有任何方法'session.getSession()' –